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

Услуги юриста - составление искового заявления в суд Новокузнецк, юридическая помощь.

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


/* файл cc.h */ #ifndef _CC_H # define _CC_H /* определяется при первом включении */ ... struct II { int x, y; }; ... #endif /* _CC_H */

Второе и последующие включения такого файла будут подставлять пустое место, что и требуется. Для файла <sys/types.h> было бы использовано макроопределение _SYS_TYPES_H.

Любой макрос можно отменить, написав директиву

#undef имяМакро

Пример:

#include <stdio.h>

#undef M_UNIX

#undef M_SYSV

main() { putchar('!'); #undef putchar

#define putchar(c) printf( "Буква '%c'\n", c); putchar('?'); #if defined(M_UNIX) defined(M_SYSV) /* или просто #if M_UNIX */ printf("Это UNIX\n"); #else

printf("Это не UNIX\n"); #endif /* UNIX */ }

Обычно #undef используется именно для переопределения макроса, как putchar в этом примере (дело в том, что putchar - это макрос из <stdio.h>).

Директива #if, использованная нами, является расширением оператора #ifdef и подставляет текст если выполнено указанное условие:

#if defined(MACRO) /* равно #ifdef(MACRO) */ #if !defined(MACRO) /* равно #ifndef(MACRO) */ #if VALUE > 15 /* если целая константа #define VALUE 25 больше 15 (==, !=, <=, ...) */ #if COND1 COND2 /* если верно любое из условий */ #if COND1 && COND2 /* если верны оба условия */

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

#if !defined(M1) && (defined(M2) defined(M3))

Условная компиляция может использоваться для трассировки программ:

#ifdef DEBUG # define DEBUGF(body) \ { \ body; \ } #else # define DEBUGF(body) #endif int f(int x){ return x*x; } int main(int ac, char *av[]){ int x = 21; DEBUGF(x = f(x); printf("%s equals to %d\n", "x", x)); printf("x=%d\n", x); }

При компиляции

cc -DDEBUG file.c

в выходном потоке программы будет присутствовать отладочная выдача. При компиляции без -DDEBUG этой выдачи не будет.

В языке C++ (развитие языка Си) слова class, delete, friend, new, operator, overload, template, public, private, protected, this, virtual являются зарезервированными (ключевыми). Это может вызвать небольшую проблему при переносе текста программы на Си в систему программирования C++, например:




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