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