C++ IFNDEF令牌定义令牌

C++ IFNDEF令牌定义令牌,c++,c-preprocessor,ifndef,C++,C Preprocessor,Ifndef,在一些情况下,我见过如下预处理器代码: #ifndef TOKEN #define TOKEN #endif 对我来说,似乎在这种情况下,我意识到它的用途,当包裹在除自身之外的项目时,包括那些仍在回答的人的防护,在定义令牌之前检查令牌是否已经定义是多余的。如果我只是定义它,没有检查,结果是一样的 这有共同的原因吗?编译时间?是否保留区块以备将来添加 谢谢。,否则您可能会收到宏重新定义警告。例如,我们有一些第三方dll,它们的标题如下所示 #define PI 3.14 由于这些是在第三方标题

在一些情况下,我见过如下预处理器代码:

#ifndef TOKEN
#define TOKEN
#endif
对我来说,似乎在这种情况下,我意识到它的用途,当包裹在除自身之外的项目时,包括那些仍在回答的人的防护,在定义令牌之前检查令牌是否已经定义是多余的。如果我只是定义它,没有检查,结果是一样的

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


谢谢。

,否则您可能会收到宏重新定义警告。例如,我们有一些第三方dll,它们的标题如下所示

#define PI 3.14
由于这些是在第三方标题中定义的,因此我们无法控制它们,也无法删除或重命名它们。如果我们也尝试自己定义Pi,我们将得到一个宏重新定义警告。所以你有两个选择

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

#ifndef PI
#define PI 3.14
#endif
2删除它们的定义,然后定义自己的定义

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

否则,您可能会收到宏重新定义警告。例如,我们有一些第三方dll,它们的标题如下所示

#define PI 3.14
由于这些是在第三方标题中定义的,因此我们无法控制它们,也无法删除或重命名它们。如果我们也尝试自己定义Pi,我们将得到一个宏重新定义警告。所以你有两个选择

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定义编译相同的代码,但也允许使用默认值。

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

gcc source.c -DMY_PI=6.5
然后在我的代码中

#ifndef MY_PI
#define MY_PI 3.1415
#endif

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

这是include guard

<>在C和C++编程语言中,包含保护,有时称为宏保护,是一种特殊的构造,用于避免在包含指令时处理双重包含问题。向头文件添加include-guard是使该文件幂等的一种方法

请查看以下详细信息:


这是包括警卫在内的

<>在C和C++编程语言中,包含保护,有时称为宏保护,是一种特殊的构造,用于避免在包含指令时处理双重包含问题。向头文件添加include-guard是使该文件幂等的一种方法

请查看以下详细信息:


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

#pragma once

在文件的顶部

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

#pragma once

在文件的顶部

当然,我真的很喜欢将PI设置为6.5,…?我从来都不确定GCC到底是什么,但很高兴知道,我会记住这一点。UE4编辑器说,在为特定目标/设置构建引擎/游戏时,就是这么做的,对吗?当然,我真的很喜欢将PI设置为6.5,…?我从来都不知道GCC到底是什么,但很高兴知道,我会记住这一点。UE4编辑器说,在为特定目标/设置构建引擎/游戏时,就是这样做的,对吧?这很有意义,谢谢。我没有得到任何错误,因为我没有想过给这两个定义添加值。我的心放松了这很有道理,谢谢。我没有得到任何错误,因为我没有想过给这两个定义添加值。我的心放松了