我们如何使用可变变量作为开关案例标签

时间:2013-10-19 02:01:42

标签: c generic-programming

我们如何将可变变量用作开关案例标签。 换一种说法, 我有一个宏定义。但我需要在运行时根据条件更改此值。我该如何实现呢?

示例如下,

此处,案例" 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);
}

2 个答案:

答案 0 :(得分:3)

switch条件需要在编译时解决。 case值需要是编译时常量表达式

根据您的问题,您希望使用运行时条件来更改case的值,这是不可能的。

实现运行时检查的一种方法是使用if条件。

答案 1 :(得分:0)

您的宏#define CONDITION (strcmp(str, "hello") == 0)未完成。它不会引起任何争论。

编译器只会说str未在此范围内定义。

无论如何,大小写值都是常量,因此您将无法实现此目的,因为您的条件取决于运行时输入。

重要的是要知道大多数编译器通过分支表来实现这些情况。这是可能的,因为案例值是编译时已知的(即常量)。编译器将生成代码以将您的输入用作此分支表的索引,以获取特定情况的逻辑。

tl; dr - 你不能使用开关。请改用if-elseif-else