C++ ifndef后我是否可以/应该键入我想要的任何内容?

C++ ifndef后我是否可以/应该键入我想要的任何内容?,c++,ifndef,C++,Ifndef,例如: #ifndef HEADER_h #define HEADER_h #endif 我可以执行以下操作,而不是HEADER_h吗 ifndef头 或 ifndef图书馆 或 如果有什么 或 如果有别的事 等等。您可以使用如下结构 #if !defined(HEADER) || !defined(LIBRARY) 对于你的问题,你正在使用 #ifndef HEADER_h #define HEADER_h #endif 这和布拉格语一样 是的,您可以使用不同的定义名称。在您的例子中

例如:

#ifndef HEADER_h
#define HEADER_h

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

ifndef头

ifndef图书馆

如果有什么

如果有别的事


等等。

您可以使用如下结构

#if !defined(HEADER) || !defined(LIBRARY)
对于你的问题,你正在使用

#ifndef HEADER_h
#define HEADER_h

#endif
这和布拉格语一样
是的,您可以使用不同的定义名称。在您的例子中,可以在codedefine MY\u VAR\u NAME或通过编译器选项Flag-DMY\u VAR\u NAME中设置库、某物、标头\u h-定义。

是的,您可以根据需要命名include guard符号,但请记住,它们在标头中应该是唯一的。你肯定不想要头球

// 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_H和其他SUBDIR_FOO_H。但这取决于您。

头保护只是一种惯例,一种技巧,利用预处理器条件。在使用标题保护时,您正在使用名称创建宏,并检查该宏是否已定义

这个宏绑定到头文件名并没有什么神奇之处,因此您可以随意调用它

但这并不意味着你应该写伊芬德夫·厄尔伯格。您希望名称有用且唯一,否则没有多大意义


通常,像ifndef[PROJECTNAME]\uu[FILENAME]\u include这样的东西是个好主意。

您的示例是一个所谓的头保护,它允许我们确保头的内容只包含一次。但是,这不是ifndef的唯一用途

 #ifndef NO_DEBUG
 do_some_debug_stuff();
 #endif

因此,这不仅适用于标题保护,而且一般来说,您必须仔细选择要引入的符号的名称,以防止它们与其他地方定义的符号冲突。只是页眉保护非常常见,存在某些约定,例如使用文件夹文件名通常足以确保唯一性。您需要注意,某些名称是保留的,例如以两个下划线或下划线开头,后跟大写字母。

您可以随意放置,但不应与可能存在的任何其他名称冲突,包括编译器或其他库使用的内部标识符。库或页眉对我来说太宽了。如果是我的课,那么肯定不会有任何冲突。你几乎可以写任何东西。您不应在下划线后面再加一个下划线或大写字母_x和x。。不应使用,因为这些是为编译器和系统库保留的。请使用答案部分获得答案。非常感谢answer@StoryTeller现在是:如果!定义标题| |!定义的库作为头部防护相当无用?我无法想象只包含一次标题会有什么帮助,除非在同一个标题中定义了符号标题和库,这使得| |多余的include-guard与pragma-one并不完全相同。尽管实际上几乎所有的现代编译器都支持,但实际上,实际上,实际上,PRARMA是由C++标准支持的。相比之下,include保护使用标准要求的功能,只要注意确保宏是唯一的,并避免使用保留名称。实际上,有些编译器曾经在支持pragma的过程中出现过一些微妙的错误。@Peter,你说得对。PrabMA不是C++标准的一部分。但是微软VC++在4.2之后,GCCAfter3.4,CLang,ARM/IAR支持这个指令。但就目前而言,大多数编译器都支持它。使用include-guard是一种更安全的变体,ofc。@user463035818,使用一个包含多个定义检查的构造,例如,当您需要检查编译器类型/OS类型时,或者当此标头保护内的逻辑取决于复合条件时,使用另一个选项。例如,如果您使用的是MinGW编译器或GCC-compiler.hm ok,则会包含该文件,因此它不仅是一个头保护,而且适用于更复杂的情况。顺便说一句,如果它应该是头保护加上检查使用了什么编译器,那么它可能应该是&¬ | |。对于| |,我仍然不明白这是如何作为一个标题守卫的。主必须返回int。@LightnessRacesinOrbit谢谢,修复了。它会自动执行此操作,即使不返回0;,我记得正确吗?它没有自动返回int类型,您必须像现在在edit中那样编写它,但实际语句返回0;是的,在身体的末端是隐含的。