Директивы условной компиляции позволяют в зависимости от условий добавить добавить в файл определенный код.
Прежде всего это такие директивы как #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;
}