Несколько операторов #ifndef - какой из них применяется - PullRequest
0 голосов
/ 13 мая 2018

Скажем, у меня есть пять файлов: main.c, sample1.c, sample1.h, sample2.c и sample2.h, где в каждом из этих файлов DEBUG_PRINTS определяется следующим образом:

#ifndef DEBUG_PRINTS
#define DEBUG_PRINTS 0
#endif

и код скомпилирован с использованием gcc:

gcc -Wall main.c sample1.c sample2.c -o main

Теперь я изменяю значение DEBUG_PRINTS в одном файле на 1. Без печати на терминал, как вы можете определить, какое значение будет применяться?

Кроме того, как я могу определить DEBUG_PRINTS локально для файла - так же, как использовать ключевое слово static для переменных?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Каждый файл составляется отдельно. Макросы из одного файла не видны ни в одном другом файле. Как только файлы скомпилированы независимо, результирующие объекты соединяются вместе для создания исполняемого файла.

0 голосов

#ifndef означает, что макрос не определен вообще в этом файле до или в заголовке, который вы включили.В вашем случае по умолчанию используется значение 0.

Если вы измените DEBUG_PRINTS в этом одном файле на 1, он будет переопределять значение #define в #ifndef, найденное в заголовочном файле.Вы в основном локально определяете или переопределяете значение по умолчанию DEBUG_PRINTS в импортированном заголовочном файле на 1.

В противном случае макросы видны только для этого файла или заголовка.

...