我试图将宏用于c代码。 但是,我坚持使用令牌连接
我有以下变数。
A, aA, bA, cA ...
并且,所有这些变量都用于相同的函数(情况有点复杂,所以只传递变量是不够的。)
如果我只有
aA, bA, cA
然后,我可以使用下面的宏。
#define CALL_FUNCTION(GROUP) \
FUNCTION(GROUP##A);
然而,因为
A
我不能再使用上面提到的宏了。 我试过了,
#define CALL_FUNCTION(GROUP) \
FUNCTION(GROUP##A);
FUNCTION(NULL);
FUNCTION(a);
FUNCTION(b);
FUNCTION(c);
但实际上,NULL不是空字符串,它没有用。
FUNCTION("");
也没有工作。
还有替代方式,
#define CALL_FUNCTION(GROUP) \
if(GROUP == NULL)\
FUNCTION(A);\
else\
FUNCTION(GROUP##A);
然而,在这种情况下,我需要写几行。 就我而言,它会导致更多的代码。
我搜索了很多,但我无法解决问题。 有没有人知道如何用空字符串标记粘贴?由于
答案 0 :(得分:2)
传递一个空参数,它将有效地与A
连接,只产生A
:
#define CALL_FUNCTION(GROUP) \
FUNCTION(GROUP##A);
CALL_FUNCTION() // expands to FUNCTION(A);
CALL_FUNCTION(a) // expands to FUNCTION(aA);
需要注意的是,当你调用CALL_FUNCTION()
时,你不会像处理函数一样传递零参数。相反,你传递一个参数 - 空。同样,MACRO(,)
使用两个空参数调用MACRO
。只是碰巧用空的串联行为就是你想要的。
答案 1 :(得分:1)
你只需要一个不带参数的第二个宏:
#define CALL_FUNCTION() \
FUNCTION(A);
#define CALL_FUNCTION(GROUP) \
FUNCTION(GROUP##A);
示例:
#include <stdio.h>
#define FUNCTION(x) printf( # x "\n" )
#define CALL_FUNCTION() FUNCTION(A)
#define CALL_FUNCTION(GROUP) FUNCTION(GROUP##A)
int main(void) {
CALL_FUNCTION();
CALL_FUNCTION(a);
CALL_FUNCTION(b);
CALL_FUNCTION(c);
return 0;
}
输出:
A
aA
bA
cA