Я видел код, как это обычно в начале заголовочных файлов:
#ifndef HEADERFILE_H
#define HEADERFILE_H
И в конце файла
#endif
Какова цель этого?
источник
Я видел код, как это обычно в начале заголовочных файлов:
#ifndef HEADERFILE_H
#define HEADERFILE_H
И в конце файла
#endif
Какова цель этого?
Это называется #include guard .
Как только заголовок включен, он проверяет, определено ли уникальное значение (в данном случае HEADERFILE_H
). Затем, если он не определен, он определяет его и переходит к остальной части страницы.
Когда код включается снова, первый ifndef
сбой, в результате чего пустой файл.
Это предотвращает двойное объявление любых идентификаторов, таких как типы, перечисления и статические переменные.
#pragma once
который делает то же самое :-)
#pragma once
не переносимый; общая #ifndef
идиома рекомендуется.
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
#ifndef
проверяет, был ли данный токен #defined
ранее в файле или во включенном файле; если нет, он включает код между ним и закрывающим #else
или, если нет #else
, #endif
оператором. #ifndef
часто используется для придания идемпотентности заголовочных файлов путем определения токена после включения файла и проверки того, что токен не был установлен вверху этого файла.
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif
#ifndef H_HEADER_NAME
.
Это предотвращает многократное включение одного и того же заголовочного файла несколько раз.
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
Предположим, вы включили этот заголовочный файл в несколько файлов. Таким образом, первый раз __COMMON_H__ не определен, он будет определен и будет включен заголовочный файл.
В следующий раз __COMMON_H__ определен, поэтому он не будет включаться снова.
Они называются ifdef или включают охранников.
При написании небольшой программы может показаться, что она не нужна, но по мере роста проекта вы можете намеренно или неумышленно включать один файл много раз, что может привести к предупреждению компиляции, как уже объявленная переменная.
#ifndef checks whether HEADERFILE_H is not declared.
#define will declare HEADERFILE_H once #ifndef generates true.
#endif is to know the scope of #ifndef i.e end of #ifndef
Если он не объявлен, что означает, что #ifndef генерирует true, тогда только часть между #ifndef и #endif выполняется иначе. Это предотвратит повторное объявление идентификаторов, перечислений, структуры и т. Д.
#pragma
такое: оно активирует специфическую для компилятора функцию. Хотя#pragma once
это очень широко поддерживаются, это нестандартное.info cpp
или посмотрите здесь ) гласит: «она не распознается всеми препроцессорами, поэтому вы не можете положиться на нее в переносимой программе». А GNU cpp оптимизирует обычные и переносимые#ifndef
идиомы, поэтому он так же эффективен, как и#pragma once
.#ifndef HEADERFILE_H
может нарушить пространство имен реализации заголовка, имя которого начинается сE
; идентификаторы, начинающиеся сE
цифры и заглавной буквы, зарезервированы для<errno.h>
. Я предлагаю#ifndef H_HEADERFILE
.