2017-02-18 21 views
1

Я иду через книгу [Давайте C-на Яшванте Kanetkar], здесь говорится:Как препроцессорные директивы работают в C?

Когда мы составляем программу, прежде чем исходный код переходит к компилятору, то проверяется С препроцессором для любого макроопределения. Когда он видит директиву #define, он просматривает всю программу в поисках макросов; где он находит один, он заменяет шаблон макроса соответствующим расширением макроса. Только после завершения этой процедуры программа обрабатывается компилятором.

Мой вопрос заключается в том, что, прежде чем программа передается компилятору, как можно препроцессор программа умеет читать СИМВОЛОВ, соответствующий макро шаблонов? Препроцессорная программа также может разделить программу на TOKENS.

+4

Закройте книгу и отложите ее в сторону. Не выбрасывайте его! Если у вас есть шанс встретиться с автором, возьмите книгу и избили его по голове. Это единственный способ, которым эта книга может быть полезна. Теперь найдите [собственный учебник C] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) и приступайте к работе. Да, я посмотрел книгу (не спрашивайте). –

+0

Ваш вопрос непонятен? Вы имеете в виду токенизацию? – Rishi

ответ

3

Это описание сбивает с толку (поэтому я не буду рекомендовать эту книгу, вместо этого напишите K&R The C Programming Language book). Препроцессор не проходит через всю программу, он предварительно обработал некоторый ввод. Только предыдущие предварительно обработанные входные данные влияют на поведение препроцессора (другими словами, препроцессор является однопроходным механизмом).

Читать на C preprocessor вики страницы, а затем прочитать документацию GNU cpp и другую документацию по preprocessor и wikibook глава о C programming/Preprocessor.

В текущих компиляторах C (по соображениям производительности) препроцессор больше не является отдельной программой, она является частью самого компилятора. Для последних GCC смотрите libcpp/ (его препроцессор библиотека, внутренняя компилятор).

При использовании GCC компилятора, вы можете получить препроцессированную форму вашего source code файла csource.c, запустив gcc -C -E csource.c > csource.i то заглянув внутрь сгенерированных препроцессированных форм csource.i (например, с pager или редактором).

(я настоятельно рекомендую делать это раз в то время, вы узнаете много, и да, вы можете быть удивлены количеством кода, запряженных обычной #include <stdio.h> директивы)

Я считаю, ваши книга объясняет неправильно. Препроцессор обрабатывает каждую предварительную обработку directive. Когда он встречает #define, он сохраняет в некоторой таблице символов препроцессора определение этого символа. Когда он встречает после, то #define появляется в этом символе препроцессора, он выполняет соответствующую замену.

+0

как препроцессор способен найти все шаблоны макросов TOKENS в исходном коде.? это мои вопросы, пожалуйста, помогите мне, ребята, это действительно очень смущает меня. –

+0

Это не работает, как вы верите. Пожалуйста, следуйте нескольким ссылкам, которые я дал. Я чувствую, что книга, которую вы читаете, не очень хороша. –

+0

Какую книгу я должен предпочесть в соответствии с вами? Спасибо –

1

В книге K & R The C Programming Language. не

Страницы №: 88

C предоставляет определенные возможности языка с помощью препроцессора, который концептуально отдельного первого шага в компиляции.

В книге Compiler Principles, Techniques and Tools by Aho, Lam, Sethi and Ullman

Page No.3

Задача сбора исходной программы иногда возложено на отдельную программу, называемую препроцессор. Препроцессор может также расширять сокращенные имена, называемые макросами, в операторы исходного языка. Измененная исходная программа - , а затем подана в компилятор.

В GCC GNU Documentation

Препроцессор Си является макро-процессор, который автоматически используется компилятором C, чтобы превратить вашу программу до фактической компиляции.

Andn читать this также.

Так из этих трех официальных источников, можно сказать, что Препроцессор программа отдельного управляет компилятором. Таким образом, в книге Let Us C от Yashwant P Kanetkar, что препроцессор - это программа, которая обрабатывает до того, как компилятор будет предлагать свое имя, не является неправильным, а расширенный код можно увидеть в файле file.i.


Теперь давайте прийти на ваш вопрос,

В книге K & R The C Programming Language.

Страница №: 89

Замена не производятся только для лексем и не происходит в кавычках.

и, как Basile не сказал в своем ответе, что

В современных компиляторов C (по соображениям производительности) препроцессор больше не является отдельной программой, она является частью самого компилятора.

и компилирование представляет собой длительный процесс, который проходит через несколько phases, препроцессор на самом деле происходит после того, как программа преобразуется в жетонах, но в качестве источников говорит, что это процесс перед компиляцией, что означает, что это будет сделано перед любым вид промежуточной генерации кода, и да, нарушение программы в токенах является первым шагом компилятора перед любым промежуточным генерированием кода.

+1

Препроцессор * может быть * (и исторически был, как '/ lib/cpp') * отдельной * программой. Фактически, он теперь включен в компилятор (например, посмотрите на исходный код [GCC] (http://gcc.gnu.org/) для его 'libcpp /' ...). –

+0

BTW, я мужчина (и дед 7 раз в 2017 году). Таким образом, вы можете: его/ее: его: 'в вашем ответе! «Базиль» - французское (и официальное) правописание моего христианского имени. Мой святой покровитель [Василий Великий] (https://en.wikipedia.org/wiki/Basil_of_Caesarea) Кесарии (английское правописание) –

+0

Да, и если преобразование программы в токены является задачей компилятора, препроцессор только заменяет токены, а препроцессор - это процесс перед компиляцией, эти утверждения противоречивы. Таким образом, смысл ** перед ** компиляцией означает до ** промежуточного генерации кода **. Btw Я отредактировал свой ответ на 'his'. :) – Siraj