Синтаксис:
#if <
[#elif <
[#elif <
[#else <
#endif
Директива #if совместно с директивами #elif, #else и #endif управляет компиляцией частей исходного файла. Каждой директиве #if в том же исходном файле должна соответствовать завершающая ее директива #endif. Между директивами #if и #endif допускается произвольное количество директив #elif (в том числе ни одной) и не более одной директивы #else. Если директива #else присутствует, то между ней и директивой #endif на данном уровне вложенности не должно быть других директив #elif.
Препроцессор выбирает один из участков <
Участок текста, не выбранный препроцессором, игнорируется на стадии препроцессорной обработки и не компилируется.
Препроцессор выбирает участок текста для обработки на основе вычисления <
Если ни одно ограниченное константное выражение не истинно, то препроцессор выбирает <
Ограниченное константное выражение описано в разделе 4.2.9 'Константные выражения'. Такое выражение не может содержать операцию sizeof (в СП ТС — может), операцию приведения типа, константы перечисления и плавающие константы, но может содержать препроцессорную операцию defined(<
#if defined(mysym) || defined(yoursym)
СП TC (в отличие от СП MSC) позволяет использовать операцию sizeof в ограниченном константном выражении для препроцессора. В следующем примере в зависимости от размера указателя определяется одна из констант — либо SDATA, либо LDATA:
#if (sizeof(void *) == 2)
#define SDATA
#else
#define LDATA
#endif
Директивы #if могут быть вложенными. При этом каждая из директив #else, #elif, #endif ассоциируется с ближайшей предшествующей директивой #if.
Примеры:
/* пример 1 */
#if defined(CREDIT)
credit();
#elif defined (DEBIT)
debit();
#else
printerror();
#endif
/* пример 2 */
#if DLEVEL > 5
#define SIGNAL 1
#if STACKUSE == 1
#derine STACK 200
#else
#define STACK 100
#endif
#else
#define SIGNAL 0
#if STACKUSE == 1
#define STACK 100
#else
#define STACK 50
#endif
#endif
/* пример 3 */
#if DLEVEL == 0
#define STACK 0
#elif DLEVEL == 1
#define STACK 100
#elif DLEVEL > 5
display(debugptr);
#else
#define STACK 200
#endif
/* пример 4 */
#define REG 1 register
#define REG2 register
#if defined (M_86)
#define REG3
#define REG4
#else
#ifdefined(M_68000)
#define REG4 register