带有空字符串的 c 标记粘贴(串联)
c token pasting (concatenation) with empty string
我正在尝试为 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);
但是,在这种情况下,我需要多写几行。
就我而言,它会导致更多代码。
我用谷歌搜索了很多,但我无法解决。
有没有人知道如何用空字符串标记粘贴?
谢谢
您只需要第二个不带参数的宏:
#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
传递一个空参数,它将有效地将任何内容与 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
。恰好与empty的串联行为就是你想要的。
我正在尝试为 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);
但是,在这种情况下,我需要多写几行。 就我而言,它会导致更多代码。
我用谷歌搜索了很多,但我无法解决。 有没有人知道如何用空字符串标记粘贴?
谢谢
您只需要第二个不带参数的宏:
#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
传递一个空参数,它将有效地将任何内容与 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
。恰好与empty的串联行为就是你想要的。