C宏与case语句组成函数名

C宏与case语句组成函数名,c,macros,C,Macros,我希望有一个宏根据其参数构造函数名,如: #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

我希望有一个宏根据其参数构造函数名,如:

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

然后去掉#define after
s2
中的分号,该分号已尝试过,但会生成错误:error:expected';'在“}”标记之前{case1:s1###case1###s2}非常感谢,这很有效。我还投票给@zwol sinec,他们都回答了我的问题。谢谢你们两位!这段代码扩展函数,变量呢?我做了一些类似的事情:
#定义MYVAR(p,s1,s2)(p==1?s1###u case1##s2:p==2?s1##u case2##s2:s1####u case3#s2)
。这是可行的,但这就是应该怎么做吗?应该怎么做?几乎可以肯定不是。我相当熟练,花了我一分钟的时间才弄明白这是怎么回事。当你编写代码时,除非有很好的理由,否则不要太聪明。我不喜欢阅读这样编写的代码,而且你没有完成任何用简单易读的switch语句无法完成的事情。谢谢,你可能是对的。实际上,我想去掉switch语句并生成更短的代码,但这些宏似乎没有什么帮助(否则你就要失败了)。