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

С помощью директив условной компиляции некоторые фрагменты исходного текста программы могут включаться в текст или исключаться из текста во время компиляции в зависимости от условий. Следует отметить, что если фрагмент текста не включается на компиляцию, то в нем могут быть какие угодно синтаксические ошибки, они на результат работы компилятора влиять не будут. Директивы условной компиляции имеют три различные формы, формат которых представлен ниже.

Первая форма:

#if <целочисленное_выражение1>

[<текст>]

[#elif < целочисленное_выражение2>

<текст>]

[#elif < целочисленное_выражение3>

<текст>]

…..

[#else

<текст>]

#endif

Целочисленное выражение не должно содержать операцию sizeof, приведение типов и константы, определенные через enum. Директива работает так, если целочисленное выражение после #if истинно (отлично от 0), то на компиляцию включается текст после #if, остальные тексты после #elif и #else на компиляцию не попадают. Если после #if выражение ложно (равно 0), то последовательно проверяются выражения после #elif, когда находится выражение истинное (отличное от 0), то на компиляцию попадает один фрагмент после этого #elif. Если не одно #elif не сработало, все целочисленные выражения ложные, то на компиляцию поступает текст после #else до #endif (если директива #else есть).

Ниже представлен пример, в котором на печать выводится else, фрагменты исходного текста, которые не поступают на компиляцию, набраны с синтаксическими ошибками.

#include <stdio.h>

#define _M 0

int main(int argc, char* argv[])

{

#if _M

pr3464572intf("1");

#elif 0

prin4363tf("2");

#elif 0

pri35252ntf("3");

#else

printf("else");

#endif

return 0;

}

Вторая форма:

#ifdef <идентификатор>

[<текст>]

[#elif < целочисленное_выражение2>

<текст>]

[#elif < целочисленное_выражение3>

<текст>]

…..

[#else

<текст>]

#endif

В этой форме первое условие считается истинным, если идентификатор после #ifdef до этого объявлен, как препроцессорный в директиве #define, в этом случае на компиляцию поступает текст после #ifdef, если идентификатор до этого не объявлен, как препроцессорный, то далее условия проверяются, как в первой форме.

Третья форма:

#ifndef <идентификатор>

[<текст>]

[#elif < целочисленное_выражение2>

<текст>]

[#elif < целочисленное_выражение3>

<текст>]

…..

[#else

<текст>]

#endif

В отличие от второй формы первое условие считается истинным, если идентификатор после #ifndef до этого не объявлен, как препроцессорный в директиве #define, а ложном в том случае, если идентификатор объявлен, как препроцессорный, в этом случае далее условия проверяются, как в первой форме.

Вместо директив #ifdef и #ifndef можно использовать более старые формы:

#if defined(<идентификатор>)

#if !defined(<идентификатор>)

defined(<идентификатор>) – может использоваться в качестве ограниченного константного выражения, например, после #elif .

Директивы условной компиляции могут использоваться для отладочных печатей, для защиты заголовочных файлов от повторного включения, а также для повышения переносимости программ.

Пример отладочных печатей, их все можно убрать из текста изменив одно строчку программы.

#include <stdio.h>

#define Pechat

 

int main(int argc, char* argv[])

{

int x=10;

int y=167;

#ifdef Pechat

printf("\nx=%d", x);

#endif

 

#ifdef Pechat

printf("\ny=%d", y);

#endif

printf("\nRez=%d", x+y);

return 0;

}

Также заголовочные файлы должны иметь защиту от повторного включения, например, все стандартные заголовочные файлы имеют защиту от повторного включения. Пример структуры файла stdio.h:

#ifndef _INC_STDIO

#define _INC_STDIO

……..

// Основное содержание файла

…….

#endif /* _INC_STDIO */

 








Дата добавления: 2015-08-14; просмотров: 671;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.01 сек.