2009-10-25 2 views

ответ

18

По той же причине #define макросов нет - они предназначены для препроцессора, который расширяет такие вещи, как include и определяет, прежде чем сам компилятор возьмет верх.

+4

Немного больше определения - предварительный процессор работает до того, как компилятор запускается, и он заменяет текст. Оператор #include заменяется содержимым ссылочного файла. Параметр #define вводится в таблицу поиска, а затем, когда определение отображается в коде, оно заменяется сохраненным значением и т. Д. И т. Д. На самом деле вы можете использовать другой препроцессор вместо стандартного, но мало люди делают это в реальном мире. –

+0

это не препроцессор, который делает фанк-линию продолжения таких вещей, как \ и конкатенирование сломанных строковых литералов? – JustJeff

+0

@JustJeff: см. Http://stackoverflow.com/questions/1476892/poster-with-the-8-phases-of-translation-in-the-c-language; конкатенация строковых литералов выполняется в фазе перевода 6 между предварительной обработкой (этап 4) и семантическим анализом/компиляцией (этап 7), поэтому вы можете делать это как в препроцессоре, так и в компиляторе; присоединение линий вдоль задней обратной косой черты происходит на этапе 2 до того, как препроцессор правильно работает – Christoph

10

строки, начинающиеся с #, не являются частью языка C, это инструкции для предварительного процессора. Когда он был впервые разработан, полуколоны просто не требовались.

4

#include является командой предварительной обработки, такой как #define. #include сообщает компилятору включить указанный файл в исходный код, прежде чем ваш код будет скомпилирован.

+1

Я исправил форматирование для вас; когда вы вводите ответ, вы можете посмотреть предварительный просмотр под текстовым полем, чтобы посмотреть, как он будет выглядеть. # является символом форматирования, поэтому вам необходимо каким-то образом защитить его. –

+0

Спасибо за помощь. – sdp07

7

«... в то время как другие заявления делают».

Во-первых, препроцессорные директивы не являются заявлениями. Ведомость - это сущность, существующая только на синтаксическом/семантическом уровне. Директивы препроцессора обрабатываются на относительно ранних этапах перевода, прежде чем начнется какой-либо синтаксический анализ, поэтому на этом этапе еще нет такой вещи, как «заявление». И по этой причине нет никакого содержательного обоснования, чтобы требовать прекращения директивы #include с точкой с запятой. Если факт, директивы препроцессора по определению занимают всю строку, что означает, что они уже оканчиваются символом новой строки. Любой дополнительный ограничитель будет лишним.

Во-вторых, не все «другие заявления» заканчиваются точкой с запятой. Составной оператор, например, не является

i = 5; 

{ /* <- compound statement begins here... */ 
    i = 10; 
} /* <- ... and ends here. Note: no semicolon */ 

i = 15; 
Смежные вопросы