我想要一个宏,它根据其参数构造函数名称,例如:
#define CASE1 1
#define CASE2 2
#define CASE3 3
#define MYFNAME(c, s1, s2)
switch(c)
{ case 1: s1 ## _case1_ ## s2;
case 2: s1 ## _case2_ ## s2;
case 3: s1 ## _case3_ ## s2; }
get_case1_val() { ... }
get_case2_val() { ... }
get_case3_val() { ... }
int main()
{
MYFNAME(1, get, val)(); // would call get_case1_val();
...
...
}
问题是,看起来宏附加在 ; 在 组合字符串的末尾,并将其预编译为:
get_case1_val;();
知道如何避免在连接字符串的末尾得到 ;
谢谢
您的问题是您尝试使用 case语句作为表达式。 这在某些编程语言中是可能的,例如Lisp和Rust,但在C中则不然。 你可以写一些类似的东西
#define CALL_MYFNNAME(c, s1, s2, ...) do {
switch(c)
{ case 1: s1 ## _case1_ ## s2 (__VA_ARGS__); break;
case 2: s1 ## _case2_ ## s2 (__VA_ARGS__); break;
case 3: s1 ## _case3_ ## s2 (__VA_ARGS__); break; } } while (0)
将实际的函数调用放在开关内。 我做了一些其他的小更正。
您在扩展中不正确。我通过 VS 预处理器运行了这个以仔细检查我是否正确。 它扩展到此,您可以看到它失败的原因。
switch(1) { case 1: get_case1_val; case 2: get_case2_val; case 3: get_case3_val; }();
格式正确
switch(1) {
case 1: get_case1_val;
case 2: get_case2_val;
case 3: get_case3_val; }();
您可能打算使用可变参数宏执行更多类似操作。
#define MYFNAME(c, s1, s2, ...)
switch(c)
{ case 1: s1 ## _case1_ ## s2(__VA_ARGS__); break;
case 2: s1 ## _case2_ ## s2(__VA_ARGS__); break;
case 3: s1 ## _case3_ ## s2(__VA_ARGS__); break; }
MYFNAME(1, get, val, list_of, arguments); // would call get_case1_val(list_of, arguments);