прекомпиляция — какова область определения прекомпилятора в c ++?

Определена ли область действия прекомпилятора файлом, в котором он определен?
например:

три файла:

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 определяется.

-4

Решение

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.

1

Другие решения

Ваше предположение верно. Если вы используете #ifndef Guard в вашем заголовке, первый раз, когда test1.hpp включается в ваше приложение препроцессором, test1_hpp будет определено и позволит включить код в ваш заголовок. В будущем включается test1.hpp, код не будет включен повторно благодаря охране.

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

0

По вопросам рекламы [email protected]