Почему после директив препроцессора нет точек с запятой? - PullRequest
3 голосов
/ 02 октября 2010

Если я напишу

#include <stdio.h>;

ошибки нет, но при компиляции выдается предупреждение

pari.c: 1: 18: предупреждение: дополнительные токены в конце директивы #include

В чем причина?

Ответы [ 6 ]

7 голосов
/ 02 октября 2010

Причина в том, что директивы препроцессора не используют точки с запятой.Это потому, что они используют разрыв строки для разделения операторов.Это означает, что вы не можете иметь несколько директив на строку:

#define ABC #define DEF // illegal

Но вы можете использовать одну директиву на нескольких строках, заканчивая каждую строку (кроме последней) знаком \ (или /, я забыл).

3 голосов
/ 02 октября 2010

Директивы препроцессора являются языком, отличным от C, и имеют гораздо более простую грамматику, потому что первоначально они были "проанализированы", если можно так назвать, другой программой под названием cpp до того, как компилятор C увидел файл.Люди могут использовать это для предварительной обработки даже файлов, отличных от C, для включения условных частей файлов конфигурации и т. П.

Существует программа для Linux под названием "unifdef", которую вы все еще можете использовать для удаления некоторых условных файлов.части программы, если вы знаете, что они никогда не будут правдой.Например, если у вас есть некоторый код для поддержки не-ANSI стандартных компиляторов, окруженный #ifdef ANSI/#else/#end или просто #ifndef ANSI/#end, и вы знаете, что вам больше не придется поддерживать не-ANSI, вы можете устранить мертвый код, запустивэто через unifdef -DANSI.

3 голосов
/ 02 октября 2010

Поскольку директивы препроцессора - это строки, включенные в код наших программ, которые являются не программными операторами, а директивами препроцессора.

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

2 голосов
/ 02 октября 2010

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

1 голос
/ 02 октября 2010

Во время компиляции ваш код обрабатывается двумя отдельными программами: препроцессором и компилятором.Предварительный процессор запускается первым.

Ваш код фактически состоит из двух языков, один из которых накладывается поверх другого.Препроцессор имеет дело с одним языком, который является всеми директивами, начинающимися с "#" (и значения этих директив).Он обрабатывает «#include», «#define» и другие директивы и оставляет остальную часть кода нетронутой (ну, за исключением побочного эффекта директив препроцессора, таких как подстановка макросов и т. Д.).

Затем приходит компилятор и обрабатывает выходные данные, сгенерированные препроцессором.Он имеет дело с языком "C" и в значительной степени игнорирует директивы препроцессора.

Ответ на ваш вопрос заключается в том, что "#include" является частью языка, обрабатываемого препроцессором, и вэтот язык ";"не являются обязательными и фактически являются «дополнительными токенами».

1 голос
/ 02 октября 2010

и если вы используете #define MACRO(para) fun(para);, то ставить за ним точку с запятой может быть НЕПРАВИЛЬНО.

if (cond) 
  MACRO (par1);
else
  MACRO (par2);

приводит к синтаксической ошибке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...