1

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

  #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定义进一步扩展。我最初认为这一定是由于定义之间TESTTEST2(hello, world)之间有空格TEST3。但是对的简单调用可以TEST (hello, world)正确扩展。有人可以解释这里发生了什么吗?

4

1 回答 1

2

单词 TEST in#define TEST3(A,B) TEST TEST2(A,B)不是类似函数的宏调用,因为它后面没有开括号。预处理器在展开TEST3(Hello, World)时遇到TEST,发现不是类函数宏的调用,将其输出为文本;然后它处理TEST2(A, B),那是一个宏调用,所以它输出相应的文本,即(Hello,World),并用左括号继续处理。TEST 消失了,再也不会被预处理了。

有关使用标准引用的宏扩展的完整讨论,请参阅C 预处理器和连接。您也可能会在一些帮助中找到How to make a char string from a C 宏的值

于 2012-11-19T06:43:07.960 回答