Препроцессор на С - PullRequest
       2

Препроцессор на С

0 голосов
/ 15 ноября 2010

Я добавил это в свой код:

#ifdef DEBUG_MODE
    printf("i=%d\n",i);
    fflush(stdout);
#endif

и мой вопрос: если я не в DEBUG_MODE, что делает компилятор при компиляции этого?

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Компилятор ничего не сделает, потому что там ничего не будет, когда DEBUG_MODE не определен.

2 голосов
/ 15 ноября 2010

#ifdef и #endif управляют условной компиляцией. Это происходит во время первоначального прохождения программы, делая глупые текстовые подстановки до того, как компилятор даже начинает считать, что файл содержит C-код. В этом случае без определенного символа остается только пробел. Текст никогда даже не встраивается в токены C, если определение препроцессора, для которого проверено, не определено в этот момент.

Вы можете убедиться в этом сами: просто вызовите компилятор с любым флагом, который он использует для остановки после предварительной обработки - например, gcc -E x.cc - и в этот момент на выходе будет просто пустая строка или две. Это также очень важный метод для понимания макросов, и это хорошо, когда вы просто не можете догадаться, почему какая-то программа работает не так, как вы ожидаете - компилятор говорит, что некоторый класс или функция не существует, и вы включили его заголовок - посмотрите на предварительно обработанный вывод, чтобы узнать, с чем действительно работает ваш компилятор.

1 голос
/ 15 ноября 2010

, если DEBUG_MODE не определено, код под ним не будет скомпилирован.

...