Примеры:
#include /* пример 1 */
#include "defs.h" /* пример 2 */
В первом примере в исходный файл включается файл с именем stdio.h. Угловые скобки сообщают препроцессору, что поиск файла нужно осуществлять в директории, указанной в командной строке компиляции, а затем в стандартных директориях.
Во втором примере в исходный файл включается файл с именем defs.h. Двойные кавычки означают, что при поиске файла сначала должна быть просмотрена директория, содержащая текущий исходный файл.
В СП ТС имеется возможность задавать имя пути в директиве #includeс помощью именованной константы. Если за словом includeследует идентификатор, препроцессор проверяет, не именует ли он константу или макроопределение. Если же за словом includeследует строка, заключенная в кавычки или в угловые скобки, СП ТС не будет искать в ней имя константы.
Примеры:
#define myinclude "c:\tc\include\mystuff.h"
#include myinclude
#include "myinclude.h"
Первая директива #includeзаставит препроцессор просматривать директорию C:\TC\INCLUDE\MYSTUFF.H, а вторая заставит искать файл MYINCLUDE.H в текущей директории.
Объединение символьных строк и склейку лексем в именованной константе, которая используется в директиве #include, использовать нельзя. Результат расширения константы должен сразу читаться как корректная директива #include.
В этом разделе описываются директивы, которые управляют условной компиляцией. Эти директивы позволяют исключить из процесса компиляции какие-либо части исходного файла посредством проверки условий (константных выражений).
Директивы #if, #elif, #else, #endif
Синтаксис:
#if < ограниченное-константное-выражение > [< текст >]
[#elif < ограниченное-константное-выражение > < текст >]
[#elif < ограниченное-константное-выражение >< текст >]
[#else < текст >]
#endif
Директива #ifсовместно с директивами #elif, #elseи #endifуправляет компиляцией частей исходного файла. Каждой директиве #ifв том же исходном файле должна соответствовать завершающая ее директива #endif. Между директивами #ifи #endifдопускается произвольное количество директив #elif(в том числе ни одной) и не более одной директивы #else. Если директива #elseприсутствует, то между ней и директивой #endifна данном уровне вложенности не должно быть других директив #elif.
Препроцессор выбирает один из участков < текста > для обработки. < Текст > может занимать более одной строки. Обычно это участок программного текста, однако это не обязательно: препроцессор можно использовать для обработки произвольного текста. Если < текст > содержит директивы препроцессора (в том числе и директивы условной компиляции), то эти директивы выполняются. Обработанный препроцессором текст передается на компиляцию.
Участок текста, не выбранный препроцессором, игнорируется на стадии препроцессорной обработки и не компилируется.
Препроцессор выбирает участок текста для обработки на основе вычисления < ограниченного-константного-выражения >, следующего за каждой директивой #ifили #elif. Выбирается < текст >, следующий за < ограниченным-константным-выражением > со значением истина (не нуль), вплоть до ближайшей директивы #elif, #else, или #endif, ассоциированной с данной директивой #if.
Если ни одно ограниченное константное выражение не истинно, то препроцессор выбирает < текст >, следующий за директивой #else. Если же директива #elseотсутствует, то никакой текст не выбирается.
Ограниченное константное выражение описано в разделе 4.2.9 "Константные выражения". Такое выражение не может содержать операцию sizeof(в СП ТС — может), операцию приведения типа, константы перечисления и плавающие константы, но может содержать препроцессорную операцию defined(< идентификатор >). Эта операция дает истинное (не равное нулю) значение, если заданный < идентификатор > в данный момент определен; в противном случае выражение ложно (равно нулю). Следует помнить, что идентификатор, определенный без значения, тем не менее рассматривается как определенный. Операция definedможет использоваться в сложном выражении в директиве #ifнеоднократно:
Читать дальше