我可以/应该在 #ifndef 后输入任何我想要的东西

Can/should I type whatever I want after #ifndef?

本文关键字:我想要 任何 输入 #ifndef 我可以      更新时间:2023-10-16

示例:

#ifndef HEADER_h
#define HEADER_h
#endif

我可以执行以下操作,而不是HEADER_h吗?

#ifndef HEADER

#ifndef LIBRARY

#ifndef SOMETHING

#ifndef ANOTHERTHING

等。

标头保护只是一个约定,一个"技巧",利用预处理器条件。在使用标头保护时,您将创建一个具有名称的宏,并检查该宏是否已定义。

这个宏没有什么神奇之处,它将其绑定到标头的文件名,因此您可以随心所欲地称呼它(在合理范围内(。

不过,这并不意味着你应该写#ifndef URGLEBURGLE您希望名称有用唯一,否则没有多大意义。

通常,像#ifndef [PROJECTNAME]_[FILENAME]_INCLUDED这样的东西是个好主意。

是的,您可以随意命名包含保护符号,但请记住,它们在标头中应该是唯一的。你绝对不想要标题

// first.h
#ifndef NON_UNIQUE_H
#define NON_UNIQUE_H
void foo();
#endif

和另一个

// second.h
#ifndef NON_UNIQUE_H
#define NON_UNIQUE_H
void bar();
#endif

当您将两者包含在一个翻译单元中时,一个将"获胜",其声明将可见,例如

// main.cpp
#include "first.h" // now, NON_UNIQUE_H is defined
#include "second.h" // NON_UNIQUE_H already there, doesn't do anything
int main(int, char**)
{
    bar(); // error, won't compile, bar() isn't declared
}

除了规避此类场景的必要性外,最好在整个项目中坚持一些惯例。一种经典的方法是将头文件基本名称转换为大写并附加_H。如果在不同的目录中具有相同基本名称的头文件,则可以包含目录名称,例如 SUBDIR_FOO_HOTHERSUBDIR_FOO_H.但这取决于你。

你可以使用这样的结构

#if !defined(HEADER) || !defined(LIBRARY)

在您的问题中,您正在使用

#ifndef HEADER_h
#define HEADER_h
#endif

与"#pragma 一次"相同是的,您可以使用不同的定义名称。在您的情况下,LIBRARY,SOMETHINGHEADER_h - 定义,您可以在代码(#define MY_VAR_NAME(或通过编译器选项(标志 -DMY_VAR_NAME(进行设置。

您的示例是所谓的标头保护,它允许我们确保标头的内容仅包含一次。但是,这不是#ifndef的唯一用途。您可以使用#ifndef进行条件编译,如

 #ifndef NO_DEBUG
 do_some_debug_stuff();
 #endif

因此,它不仅适用于标题护罩,而且通常您必须仔细选择要引入的符号的名称,以防止它们与其他地方定义的符号发生冲突。只是标头保护是如此普遍,以至于存在某些约定(例如,使用 FOLDER_FILENAME_H 通常足以确保唯一性(。并且您需要注意某些名称是保留的(例如,以两个下划线或下划线开头,后跟大写字母(。