gpt4 book ai didi

c++ - 宏名称和替换列表相同

转载 作者:太空狗 更新时间:2023-10-29 19:59:38 25 4
gpt4 key购买 nike

我发现了一些预处理指令,其中宏名称和替换列表相同。比如gcc提供的stdbool.h中的一些预处理指令。

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true

#endif /* __cplusplus */

我不明白程序员为什么要写这些预处理指令。它们没用,更换会浪费时间。我知道这不会导致无限递归。如何避免无限递归? C标准中有哪些相关规定?

最佳答案

C++11 标准第 16.3.4 节第 2 段阻止了宏替换期间的无限递归:

If the name of the macro being replaced is found during this scan of the replacement list (not including the rest of the source file’s preprocessing tokens), it is not replaced. Furthermore, if any nested replacements encounter the name of the macro being replaced, it is not replaced. These nonreplaced macro name preprocessing tokens are no longer available for further replacement even if they are later (re)examined in contexts in which that macro name preprocessing token would otherwise have been replaced.

基本上,这意味着出现在其自身扩展中的宏不会被再次替换。

true,bool,false之所以被GCC扩展定义为宏,是为了让C++代码更兼容C99 .在 C99 中,这些在 stdbool.h 中定义为宏,因此代码可以检查它们是否使用例如定义#ifdef bool 值

关于c++ - 宏名称和替换列表相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12262754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com