C - 我们如何将可变变量用作开关案例标签



我们如何将可变变量用作开关大小写标签。换句话说,我定义了一个宏。但是我需要根据条件在运行时更改此值。我该如何实现?

下面给出了示例,

在这里,案例"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

最新更新