1

假设我在包含文件中有一个宏:

// a.h
#define VALUE SUBSTITUTE

另一个包含它的文件:

// b.h
#define SUBSTITUTE 3
#include "a.h"

是 VALUE 现在定义为 SUBSTITUTE 并且将在两次传递中宏扩展为 3 的情况,还是 VALUE 已设置为 SUBSTITUTE 的宏扩展值(即 3)的情况?

我问这个问题是为了试图理解 Boost 预处理器库以及它的 BOOST_PP_SLOT 如何定义工作(编辑:我的意思是底层工作)。因此,当我问上述问题时,如果有人能解释一下,我也很感兴趣。

(而且我想我也想知道到底在哪里可以找到“涂成蓝色”的规则写在哪里......)

4

1 回答 1

1

VALUE定义为SUBSTITUTE。的定义VALUE在任何时候都不知道SUBSTITUTE也已定义。替换后VALUE,将再次扫描它所替换的任何内容,然后可能会应用更多替换。所有define的s都存在于自己的概念空间中,完全不知道彼此;它们在主程序文本中的扩展位置相互交互(defines 是指令,因此不是程序本身的一部分)。

预处理器的规则与语言标准中的 C 规则一起指定。标准文件本身要花钱,但你通常可以免费下载“终稿”;最新的(C11)可以在这里找到:http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

对于家庭使用,草稿几乎等同于真实物品。大多数引用该标准的人实际上是在查看草案的副本。(当然,它比任何现实世界的 C 编译器都更接近实际标准......)

GCC 手册中对宏规则有更易于理解的描述:http: //gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html


此外......我不能告诉你很多关于 Boost 预处理器库的信息,没有使用它,但是有一对漂亮的库由同一作者称为Order 和 Chaos,它们非常“干净”(就像宏代码一样)和容易理解。它们在语气上更具学术性,旨在纯粹而不是便携;这可能使他们更容易阅读。

(因为我不知道 Boost PP,所以我不知道这与您的问题有多相关,但是)在这个答案中还有一个很好的介绍性示例,这些库用于高级元编程结构的技术的孩子:C99 预处理器图灵完全的?

于 2013-06-13T18:07:31.943 回答