使用空字符串进行C令牌拼接(连接)

3

我正在尝试使用宏来处理C代码。

然而,我在使用标记连接时遇到了困难。

我有以下变量。

A, aA, bA, cA ...

同时,所有这些变量都用于同一个函数(情况有点复杂,所以仅传递变量是不够的)。

如果我只有

aA, bA, cA

然后,我可以使用以下宏来完成。
#define CALL_FUNCTION(GROUP) \
     FUNCTION(GROUP##A);

However, because of

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);

然而,在这种情况下,我需要写更多的代码。

我搜索了很多,但是没有找到解决方案。有没有人知道如何使用空字符串进行令牌粘贴?

谢谢。

2个回答

4
传递一个空参数,在实际上将什么都不与 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

你只需要一个不带参数的第二个宏:

#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

1
你的例子让我收到一个有关宏被重新定义的警告。碰巧的是,通过重新定义解决了空参数和非空参数的问题。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接