Условная компиляция


Директивы условной компиляции позволяют в зависимости от условий добавить добавить в файл определенный код.

Прежде всего это такие директивы как #if/#else/#endif, действие которых напоминает условную конструкцию if:

1
2
3
4
5
#if условие
текст_1
#else
текст_2
#endif
Если условие возвращает ненулевое значение (то есть оно истинно), то в итоговый исходный файл вставляется текст_1. Если же условие возвращает 0 (то есть оно ложно), то вставляется текст_2. Например:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#define N 22

int main(void)
{
#if N==22
printf("N=22");
#else
printf("N is undefined");
#endif
return 0;
}
С помощью директивы #elif можно проверять дополнительные условия:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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 можно проверять, определен ли идентификатор, и если он определен, вставлять в исходный код определенный текст:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#define DEBUG

int main(void)
{
#ifdef DEBUG
printf("Debug mode");
#endif
return 0;
}
Обратным действием обладает директива #ifndef - она включает текст, если идентификатор не определен:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
//#define DEBUG

int main(void)
{
#ifndef DEBUG
printf("Production mode");
#else
printf("Debug mode");
#endif
return 0;
}
Если нам одновременно надо проверить значения двух идентификаторов, то можно использовать специальный оператор defined:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}