Определена ли область действия прекомпилятора файлом, в котором он определен?
например:
три файла:
test1.hpp / test1.cpp
test2.hpp / test2.cpp
test3.hpp / test3.cpp
Внутри test1.cpp:
#ifndef test1_hpp
#define test1_hpp
// some declarations
#endif
test2.hpp
а также test.hpp
и то и другое #include
test1.hpp. Если область действия test1_hpp — это целое приложение, насколько я понимаю, только один может включить test1.hpp success. Потому что после включения test1_hpp определяется.
test2.hpp и test.hpp оба #include test1.hpp. Если область действия test1_hpp — это целое приложение, насколько я понимаю, только один может включить test1.hpp success. Потому что после включения test1_hpp определяется.
Компилятор работает на translation units
(подумайте: отдельные файлы .cpp) нет whole application
(думаю: исполняемый файл). Что ты называешь the scope of the pre-compiler define
это ток блок перевода. В вашем примере // some declarations
участие в test1.hpp
будет виден / обработан в каждом из CPP, которые включают test1.hpp
прямо или косвенно, т.е. во всех test1.cpp
(Непосредственно), test2.cpp
, test3.cpp
(косвенно, через both #include test1.hpp
).
#ifndef test1_hpp
это общая идиома, предотвращающая случайное включение одного и того же заголовочного файла несколько раз в том же блок перевода — см. например Использование охранников #include.
Ваше предположение верно. Если вы используете #ifndef
Guard в вашем заголовке, первый раз, когда test1.hpp включается в ваше приложение препроцессором, test1_hpp
будет определено и позволит включить код в ваш заголовок. В будущем включается test1.hpp, код не будет включен повторно благодаря охране.
Это необходимо, по большей части, для предотвращения двойных определений при включении заголовка в несколько файлов вашего проекта и соблюдения одно определение правила.