C:为什么宏观扩张不是递归发生的?

时间:2012-11-19 06:38:20

标签: c c-preprocessor

我有一个如下的测试程序。

  #define TEST(A,B)  A
  #define TEST2(A,B) (A,B)
  #define TEST3(A,B) TEST TEST2(A,B)

  int main()
  {
     TEST3(Hello,World)  //This will expand to TEST (Hello,World)
     TEST (hello, World) // This will expand to hello
  }

TEST3将扩展为“TEST (Hello,World)”,但不会使用TEST定义进一步扩展。我最初认为它必须归因于TEST定义中TEST2(hello, world)TEST3之间的空格。但TEST (hello, world)的简单调用正确扩展。有人能解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

#define TEST3(A,B) TEST TEST2(A,B)中的单词TEST不是类似函数的宏调用,因为它后面没有开括号。当预处理器正在扩展TEST3(Hello, World)时,它遇到TEST,发现它不是类函数宏的调用,并将其作为文本输出;然后它处理TEST2(A, B)并且这是一个宏调用,因此它输出相应的文本,即(Hello,World),并继续使用左括号进行处理。 TEST已经消失,永远不会再被预处理。

有关宏扩展的完整讨论,请参阅C preprocessor and concatenation。您也可以找到How to make a char string from a C macro's value的帮助。