繁体   English   中英

我可以/应该在#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_HOTHERSUBDIR_FOO_H 但这取决于您。

您可以使用类似

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

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

#ifndef HEADER_h
#define HEADER_h

#endif

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

您的示例是所谓的标题保护,使我们能够确保仅将标题的内容包含一次。 但是,这不是#ifndef的唯一用法。您可以使用#ifndef进行条件编译,如下所示

 #ifndef NO_DEBUG
 do_some_debug_stuff();
 #endif

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM