c语言 - 将宏定义为逗号(以将争论与该 marco 分开)在函数参数中正常工作,但在其他宏中则不然



我想出一个小例子来说明这个问题

假设我有这个宏

#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 参数替换

  1. 在确定了调用类似函数的宏的参数后,参数 进行替换。替换列表中的参数,除非前面有 # 或 ## prepro- cessing 令牌或后跟 ## 预处理令牌(见下文),替换为相应的 在其中包含的所有宏都已扩展之后的参数。在被替换之前,每个 参数的预处理标记被完全宏替换,就好像它们构成了其余的 预处理文件;没有其他预处理令牌可用。

你的第二个问题类似但不相关。展开of后,展开sum为时已晚,因为它不再被预处理器扫描:

6.10.3.4 重新扫描和进一步更换

替换
  1. 列表中的所有参数都被替换并且 # 和 ## 处理具有 发生时,将删除所有位置标记预处理标记。生成的预处理令牌 然后重新扫描序列以及源文件的所有后续预处理令牌,以 要替换的更多宏名称。