我们如何将可变变量用作开关案例标签。 换一种说法, 我有一个宏定义。但我需要在运行时根据条件更改此值。我该如何实现呢?
示例如下,
#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);
}
答案 0 :(得分:3)
switch
条件需要在编译时解决。 case
值需要是编译时常量表达式
根据您的问题,您希望使用运行时条件来更改case
的值,这是不可能的。
实现运行时检查的一种方法是使用if
条件。
答案 1 :(得分:0)
您的宏#define CONDITION (strcmp(str, "hello") == 0)
未完成。它不会引起任何争论。
编译器只会说str未在此范围内定义。
无论如何,大小写值都是常量,因此您将无法实现此目的,因为您的条件取决于运行时输入。
重要的是要知道大多数编译器通过分支表来实现这些情况。这是可能的,因为案例值是编译时已知的(即常量)。编译器将生成代码以将您的输入用作此分支表的索引,以获取特定情况的逻辑。
tl; dr - 你不能使用开关。请改用if-elseif-else