我有一个如下的测试程序。
#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)
的简单调用正确扩展。有人能解释一下这里发生了什么吗?
答案 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的帮助。