Ну, это законно, потому что имеет , чтобы быть законным.Поскольку вы часто включаете один и тот же заголовок несколько раз, даже не осознавая этого.
В файл .cpp можно включить два заголовка, каждый из которых содержит несколько файлов, некоторые из которых могут быть включены обоими.
Например, все стандартные заголовки библиотеки (например, string
или vector
), вероятно, включены в большинство ваших заголовков.Таким образом, вы быстро получаете один и тот же заголовок, который косвенно включается несколько раз в один и тот же файл .cpp.
Короче говоря, у него есть , иначе весь код C ++ развалится.
Что касается , как это работает, обычно через охранников.Помните, что #include
просто выполняет простое копирование / вставку: он вставляет содержимое файла заголовка на сайт #include
.
Итак, допустим, у вас есть файл заголовка header.h
со следующим содержимым:
class MyClass {};
теперь давайте создадим файл cpp, который включает его дважды:
#include "header.h"
#include "header.h"
препроцессор расширяет это до:
class MyClass {};
class MyClass {};
, что, очевидно, вызывает ошибку:один и тот же класс определяется дважды.Так что это не работает.Вместо этого давайте изменим заголовок так, чтобы он содержал include guard :
#ifndef HEADER_H
#define HEADER_H
class MyClass {};
#endif
Теперь, если мы включим его дважды, мы получим это:
#ifndef HEADER_H
#define HEADER_H
class MyClass {};
#endif
#ifndef HEADER_H
#define HEADER_H
class MyClass {};
#endif
И эточто происходит, когда препроцессор обрабатывает его:
#ifndef HEADER_H // HEADER_H is not defined, so we enter the "if" block
#define HEADER_H // HEADER_H is now defined
class MyClass {};// MyClass is now defined
#endif // leaving the "if" block
#ifndef HEADER_H // HEADER_H *is* defined, so we do *not* enter the "if" block
//#define HEADER_H
//
//class MyClass {};
//
#endif // end of the skipped "if" block
Итак, конечный результат состоит в том, что MyClass
был определен только один раз , даже если заголовок был включен дважды.И поэтому полученный код действителен.
Это важное свойство заголовочных файлов.Всегда определяйте заголовки так, чтобы их можно было включать несколько раз.