带有 case 语句的 C 宏,用于编写函数名称



我想要一个宏,它根据其参数构造函数名称,例如:

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

相关内容

  • 没有找到相关文章

最新更新