Директивы условной компиляции позволяют в зависимости от условий добавить добавить в файл определенный код.
Прежде всего это такие директивы как #if/#else/#endif, действие которых напоминает условную конструкцию if:
#if условие исходный_код #endif
Если условие возвращает ненулевое значение (то есть оно истинно), то в итоговый исходный файл вставляется исходный код, который расположен между директивами #if и #endif:
#include <stdio.h> #define N 22 int main(void) { #if N==22 printf("N=22"); #endif return 0; }
Директива #else позволяет задать альтернативый код, который компилируется, если условие не верно:
#include <stdio.h> #define N 22 int main(void) { #if N==22 printf("N=22"); #else printf("N is undefined"); #endif return 0; }
С помощью директивы #elif можно проверять дополнительные условия:
#include <stdio.h> #define N 24 int main(void) { #if N==22 printf("N = 22"); #elif N==24 printf("N=24"); #else printf("N is undefined"); #endif return 0; }
С помощью директивы #ifdef можно проверять, определен ли идентификатор, и если он определен, вставлять в исходный код определенный текст:
#include <stdio.h> #define DEBUG int main(void) { #ifdef DEBUG printf("Debug mode"); #endif return 0; }
Обратным действием обладает директива #ifndef - она включает текст, если идентификатор не определен:
#include <stdio.h> //#define DEBUG int main(void) { #ifndef DEBUG printf("Production mode"); #else printf("Debug mode"); #endif return 0; }
Если нам одновременно надо проверить значения двух идентификаторов, то можно использовать специальный оператор defined:
#include <stdio.h> #define BETA #define DEBUG int main(void) { #if defined DEBUG && !defined BETA printf("debug mode; final version"); #elif defined DEBUG && defined BETA printf("debug mode; beta version"); #else printf("undefined mode"); #endif return 0; }