Хрестоматия по программированию на Си в Unix


Мобильность и машинная зависимость программ. Проблемы с русскими буквами. - стр. 5


#define XX

то в программу подставляется вариант1, если же нет - вариант2. Оператор #else не обязателен - при его отсутствии вариант2 пуст. Существует также оператор #ifndef, который подставляет вариант1 если макрос XX не определен. Есть еще и оператор #elif else if:

#ifdef макро1

... #elif макро2

... #else

... #endif

Определить макрос можно не только при помощи #define, но и при помощи ключа компилятора, так

cc -DXX file.c ...

соответствует включению в начало файла file.c директивы

#define XX

А для программы

main(){ #ifdef XX

printf( "XX = %d\n", XX); #else printf( "XX undefined\n"); #endif }

ключ

cc -D"XX=2" file.c ...

эквивалентен заданию директивы

#define XX 2

Что будет, если совсем не задать ключ -D в данном примере?

Этот прием используется в частности в тех случаях, когда какие-то стандартные типы или функции в данной системе носят другие названия:

cc -Dvoid=int ... cc -Dstrchr=index ...

В некоторых системах компилятор автоматически определяет специальные макросы: так компиляторы в UNIX неявно подставляют один из ключей (или несколько сразу):

-DM_UNIX

-DM_XENIX

-Dunix

-DM_SYSV

-D__SVR4

-DUSG

... бывают и другие

Это позволяет программе "узнать", что ее компилируют для системы UNIX. Более подробно про это написано в документации по команде cc.

Оператор #ifdef применяется в include-файлах, чтобы исключить повторное включение одного и того же файла. Пусть файлы aa.h и bb.h содержат

aa.h bb.h

#include "cc.h" #include "cc.h" typedef unsigned long ulong; typedef int cnt_t;

А файлы cc.h и 00.c содержат

cc.h 00.c

... #include "aa.h" struct II { int x, y; }; #include "bb.h" ... main(){ ... }

В этом случае текст файла cc.h будет вставлен в 00.c дважды: из aa.h и из bb.h. При компиляции 00.c компилятор сообщит "Переопределение структуры II". Чтобы includeфайл не подставлялся еще раз, если он уже однажды был включен, придуман следующий прием - следует оформлять файлы включений так:




- Начало -  - Назад -  - Вперед -



Книжный магазин