C++ #ifndef TOKEN #define TOKEN

C++ #ifndef TOKEN #define TOKEN

本文关键字:TOKEN #define #ifndef C++      更新时间:2023-10-16

在一些情况下,我看到了如下预处理器代码:

#ifndef TOKEN
#define TOKEN
#endif

对我来说,在这种情况下(我知道它在包裹自己以外的物品时的用途(包括那些仍在回答的人的警卫)),在定义TOKEN之前检查它是否已经定义是多余的。如果我只是#define它,没有检查,结果是一样的。

这有共同的原因吗?编译时间?是否保留块以备将来添加?

谢谢。

因为否则可能会收到宏重新定义警告。例如,我们有一些第三方dll,它们的标头包含以下内容。

#define PI 3.14

由于这些是在第三方标头中定义的,我们无法控制它们,也无法删除或重命名它们。如果我们也试图自己定义圆周率,我们会得到一个宏观的重新定义警告。所以你有两个选择,

1) 使用他们的宏,并防止重新定义

#ifndef PI
#define PI 3.14
#endif

2) 删除他们的定义,然后定义你自己的

#ifdef PI
#undef PI
#endif
#define PI 3.14

使用宏可以做的一件很酷的事情是在命令行上定义它们,对于gcc,我经常使用

gcc source.c -DMY_PI=6.5

然后在我的代码中

#ifndef MY_PI
#define MY_PI 3.1415
#endif

这允许我编译具有许多不同MY_PI定义的相同代码,但也允许使用默认值。

您的确切示例通常用于多重包含保护(include-guard)。在大型代码库中,您可能有一个包含在多个点中的h文件,此构造用于避免重新定义错误。在现代编译器中,它可以用代替

#pragma once

位于文件顶部。

这是include-guard。

在C和C++编程语言中,#include保护(有时称为宏保护)是使用to avoid the problem of double inclusion when dealing with the include directive的一种特殊构造。在头文件中添加#include-guard是使该文件幂等的一种方法。

请查看下面的详细信息:

http://en.wikipedia.org/wiki/Include_guard

C++-标头保护