我可以/应该在#ifndef之后输入想要输入的内容吗?

时间:2019-02-05 10:31:13

标签: c++ ifndef

示例:

#ifndef HEADER_h
#define HEADER_h

#endif

我可以代替HEADER_h进行以下操作吗?

#ifndef HEADER

#ifndef LIBRARY

#ifndef SOMETHING

#ifndef ANOTHERTHING

4 个答案:

答案 0 :(得分:2)

标题防护只是利用预处理程序条件的一种约定,是一个“技巧”。使用标题保护程序时,您要创建一个具有名称的宏,并检查该宏是否已定义。

此宏将其绑定到标头的文件名没有什么神奇之处,因此您可以随意调用它(within reason)。

但这并不意味着您应该#ifndef URGLEBURGLE。您希望名称是有用的唯一的,否则没有什么意义。

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

答案 1 :(得分:1)

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

// 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

将两者同时包含在一个翻译单元中时,例如“ pwin”会赢,并且其声明也将可见。

// 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。但这取决于你。

答案 2 :(得分:0)

您可以使用类似

的结构
#if !defined(HEADER) || !defined(LIBRARY)

您的问题是使用

#ifndef HEADER_h
#define HEADER_h

#endif

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

答案 3 :(得分:0)

您的示例是所谓的标题保护,使我们能够确保仅将标题的内容包含一次。但是,这并不是#ifndef的唯一用法。您可以像

一样使用#ifndef进行条件编译
 #ifndef NO_DEBUG
 do_some_debug_stuff();
 #endif

因此,不仅对于标头保护符,而且通常来说,您必须仔细选择要引入的符号的名称,以防止它们与其他地方定义的符号冲突。仅仅是报头保护很常见,以至于存在某些约定(例如,使用FOLDER_FILENAME_H通常足以确保唯一性)。而且您需要知道某些名称是保留的(例如,以两个下划线开头或下划线后跟大写字母)。