我们如何将可变变量用作开关大小写标签。换句话说,我定义了一个宏。但是我需要根据条件在运行时更改此值。我该如何实现?
下面给出了示例,
在这里,案例"FOO"会起作用吗?
#define CONDITION (strcmp(str, "hello") == 0)
#define FOO1 (10)
#define FOO2 (20)
#define FOO ((CONDITION) ? (FOO1) : (FOO2))
char *var="hello";
int main()
{
int p = 20;
switch(p) {
case FOO:
printf("n case FOO");
break;
case 30:
printf("n case 30");
break;
default:
printf("n case default");
break;
}
return(0);
}
switch
条件需要在编译时解决。case
值必须是编译时常量表达式
从您的问题中,您想使用运行时条件来更改case
的值,因此这是不可能的。
实现运行时检查的一种方法是使用if
条件。
您的宏#define CONDITION (strcmp(str, "hello") == 0)
不完整。它不需要任何争论。
编译器只会说 str 没有在此范围内定义。
无论如何,事例值都是常量,因此您将无法实现此目的,因为您的条件取决于运行时输入。
重要的是要知道大多数编译器通过分支表实现这些案例。这之所以可能,只是因为大小写值是编译时已知的(即常量)。编译器将生成代码,以使用输入作为此分支表的索引,以获取特定情况的逻辑。
tl;dr - 不能使用开关。改用 if-elseif-else