我想出一个小例子来说明这个问题
假设我有这个宏
#define and ,
我像sum(a and b)
一样使用它,应该扩展到sum(a, b)
.
我的问题是,如果sum
是由宏定义的,则使用示例会遇到too few arguments ...
错误。
我认为可能相关的另一个问题,我想可以通过相同的技巧解决,是当我定义一个空宏并将其放置在函数名称和参数列表之间时。例如
#define of
现在当我使用sum of(1, 2)
时,编译器将sum
视为函数,如果它是一个宏,那么链接器会抛出undefined reference
错误。
#define of
#define sum(a, b) a + b
int main()
{
sum of(a, b); // undefined reference to `sum'
}
and
宏的问题在于,在将and
替换为宏之前a and b
被标识为宏参数,
发生。
6.10.3.1 参数替换
- 在确定了调用类似函数的宏的参数后,参数 进行替换。替换列表中的参数,除非前面有 # 或 ## prepro- cessing 令牌或后跟 ## 预处理令牌(见下文),替换为相应的 在其中包含的所有宏都已扩展之后的参数。在被替换之前,每个 参数的预处理标记被完全宏替换,就好像它们构成了其余的 预处理文件;没有其他预处理令牌可用。
你的第二个问题类似但不相关。展开of
后,展开sum
为时已晚,因为它不再被预处理器扫描:
6.10.3.4 重新扫描和进一步更换
替换
- 列表中的所有参数都被替换并且 # 和 ## 处理具有 发生时,将删除所有位置标记预处理标记。生成的预处理令牌 然后重新扫描序列以及源文件的所有后续预处理令牌,以 要替换的更多宏名称。