我可以/应该在 #ifndef 后输入任何我想要的东西
Can/should I type whatever I want after #ifndef?
示例:
#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_H
和OTHERSUBDIR_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
通常足以确保唯一性(。并且您需要注意某些名称是保留的(例如,以两个下划线或下划线开头,后跟大写字母(。
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 矢量在C++中,我的代码可以工作,但不是我想要的那样