假设我在包含文件中有一个宏:
// a.h
#define VALUE SUBSTITUTE
另一个包含它的文件:
// b.h
#define SUBSTITUTE 3
#include "a.h"
是否现在将VALUE定义为SUBSTITUTE并且将两次传递宏扩展为3,或者是否已将VALUE设置为SUBSTITUTE的宏扩展值(即3)?
我想问这个问题是为了试图理解Boost预处理器库以及它的BOOST_PP_SLOT如何定义工作(编辑:我的意思是底层工作)。因此,当我问上述问题时,如果有人能够解释,我也会感兴趣。
(我想我也想知道在哪里找到'涂成蓝色'的规则......)
答案 0 :(得分:0)
VALUE
定义为SUBSTITUTE
。 VALUE
的定义在任何时候都不知道SUBSTITUTE
也已被定义。更换VALUE
后,将替换被替换的内容,然后再应用更多替换。所有define
都存在于他们自己的概念空间中,彼此完全没有意识到;他们只在主程序文本的扩展站点互相交互(define
s是指令,因此不属于程序的一部分。)
预处理器的规则与语言标准中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 and Chaos的一对漂亮的库非常“干净”(如同宏代码去),易于理解。他们的语气更具学术性,旨在纯粹而不是便携;哪些可能使他们更容易阅读。
(因为我不知道Boost PP我不知道这与你的问题有多相关,但是)还有一个很好的介绍性例子,这些库用于高级元编程在这个答案中构造:Is the C99 preprocessor Turing complete?