【发布时间】:2015-09-26 19:49:36
【问题描述】:
我最近看到一些这样的代码:
#define JOIN(lhs, rhs) JOIN_(lhs, rhs)
#define JOIN_(lhs, rhs) JOIN__(lhs, rhs)
#define JOIN__(lhs, rhs) lhs##rhs
我测试了代码,调用如下:
JOIN(Foo, 0);
JOIN_(Foo, 1);
JOIN__(Foo, 2);
JOIN(Foo, JOIN(A,B));
JOIN_(Foo, JOIN(A,B));
JOIN__(Foo, JOIN(A,B));
宏扩展为以下符号:
Foo0
Foo1
Foo2
FooAB
FooAB
FooJOIN
我明白了目的,它以不同的方式解决争论。在最后一种情况下,调用JOIN 的任何变体显然不一样。但是这些宏是如何扩展的呢?为什么参数的行为不同?
编辑:Here's 文件
【问题讨论】:
-
我认为,最后一个宏
JOIN__(Foo, JOIN(A,B));' should be expanded asFooJOIN(A,B)` 而不仅仅是FooJOIN,请澄清。 -
有可能。我得到
warning: implicit declaration of function 'FooJOIN' is invalid in C99,所以我真的看不出它得到了哪些论据。但是你说的有道理