【问题标题】:What is the purpose of a 'switch 0' statement in C?C中'switch 0'语句的目的是什么?
【发布时间】:2017-12-04 00:38:56
【问题描述】:

came across下面这行代码,我不知道它做了什么。

#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0)

switch (0) 部分有什么作用?假设0 等价于false,那是否意味着我们永远不会输入 switch 语句?

同样对于case (a)这一行,你怎么能给出未知的a变量作为case呢?

【问题讨论】:

  • 所有这一切似乎都是在检查a 是一个编译时常量。 b 甚至没有被使用。它扩展为的代码在没有真正做任何事情的情况下就失败了。 switch (0)switch (100) 或任何其他值没有区别。它分支到case 0 并从那里继续执行。 a 不应该是一个变量,它是你传递给宏的任何东西。它应该是一个常数。如果你传递一个变量,你会得到一个编译时错误。
  • static_assert 可以给你一些提示,虽然这里的意图和用法不同,这个名字不是一个好的选择
  • 作为标准 static_assert 的实现存在缺陷,因为它不能在函数之外工作

标签: c switch-statement


【解决方案1】:

switch(0) 将始终执行与case 0: 块关联的代码块;仍然,这里没有实际执行的代码 - 两种情况都是空的。

这里的重点是如果断言的表达式 (a) 未被验证,在编译时会使编译器生气:在这种情况下,扩展宏将有两个 case 0: -一个显式提供,另一个使用断言表达式的结果(因此,如果失败,则为 0);这会导致 switch 带有两个相同的 case,这是不允许的,并且会使编译器在编译时停止并出现错误。

如果传递的表达式不是在编译时评估的常量(因为你不能有运行时确定的case 值),这也会失败,这也是static_assert 所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多