我有以下代码
#define SWITCH(S) char *_S = S; if (0)
#define CASE(S) } else if (strcmp(_S, S) == 0) {switch(1) { case 1
#define BREAK }
#define DEFAULT } else {switch(1) { case 1
int main()
{
char buf[256];
printf("\nString - Enter your string: ");
scanf ("%s", buf);
SWITCH (buf) {
CASE ("abcdef"):
printf ("B1!\n");
BREAK;
CASE ("ghijkl"):
printf ("C1!\n");
BREAK;
DEFAULT:
printf ("D1!\n");
BREAK;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我生成预处理器代码gcc -E,我将得到以下代码
int main()
{
char buf[256];
printf("\nString - Enter your string: ");
scanf ("%s", buf);
char *_S = buf;
if (0) {
} else if (strcmp(_S, "abcdef") == 0) {switch(1) { case 1:
printf ("B1!\n");
};
} else if (strcmp(_S, "ghijkl") == 0) {switch(1) { case 1:
printf ("C1!\n");
};
} else {switch(1) { case 1:
printf ("D1!\n");
};
}
}
Run Code Online (Sandbox Code Playgroud)
但是对于一些char *_S = buf;在代码中间定义的gcc 并不是wolcome并且可能提供编译错误
如何解决我的宏?
请不要建议定义char *_S为全局(out of the main)
完全删除宏,并以"扩展"方式写入,将声明移到顶部.这些宏是可怕的.
如果做不到这一点,请调整SWITCH以引入新的范围(第二个{).这当然会迫使你必须关闭两个范围,所以也许最后要添加一个SWITCH_END可憎的用来封装它.随你.
不好了!!!
我在这篇文章中写道这是一个笑话
不要使用它是非常可怕的,如果你想避免if-else你可以做而不折磨编译器,考虑使用字符串对:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[256];
const char *ap[] = {
"abcdef", "B1!\n",
"ghijkl", "C1!\n",
NULL , "D1!\n",
}, **p = ap;
printf("\nString - Enter your string: ");
scanf ("%s", buf);
while (*p) {
if (strcmp(buf, *p) == 0) break;
p += 2;
}
printf("%s", *(++p));
return 0;
}
Run Code Online (Sandbox Code Playgroud)