2.4 Заголовки, используемые только один раз
Если файл заголовка включается дважды, компилятор обработает его содержимое дважды. Это очень вероятно приведет к ошибке, например, когда компилятор увидит дважды одно и то же определение структуры. Даже если этого не произойдет, это определенно потратит время.
Стандартный способ предотвращения этого — заключить все реальное содержимое файла в условный оператор, например:
/* File foo. */ #ifndef FILE_FOO_SEEN #define FILE_FOO_SEEN the entire file #endif /* !FILE_FOO_SEEN */
Эта конструкция обычно известна как обертка #ifndef. Когда заголовок включается снова, условный оператор будет ложным, потому что FILE_FOO_SEEN определено. Препроцессор пропустит все содержимое файла, и компилятор не увидит его дважды.
CPP оптимизирует ещё сильнее. Он запоминает, когда файл заголовка имеет оберточную «#ifndef». Если последующий «#include» указывает на этот заголовок, и макрос в «#ifndef» всё ещё определён, он не тратит время на повторное сканирование файла.
Вы можете поместить комментарии за пределами обертки. Они не повлияют на эту оптимизацию.
Макрос FILE_FOO_SEEN называется контролирующим макросом или макросом-защитой. В файле заголовка пользователя имя макроса не должно начинаться с «_». В системном файле заголовка оно должно начинаться с «__», чтобы избежать конфликтов с пользовательскими программами. В любом типе файла заголовка имя макроса должно содержать имя файла и некоторый дополнительный текст, чтобы избежать конфликтов с другими файлами заголовков.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/cpp/Once-Only-Headers.html