我came across以下代码行,我无法弄清楚它的作用。
#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0)
switch (0)
部分有什么作用?假设0
等同于false
,这是否意味着我们永远不会输入switch语句?
同样对于case (a)
行,您如何将未知的a
变量作为案例?
答案 0 :(得分:5)
switch(0)
将始终执行与case 0:
块关联的代码块;仍然,这里没有实际执行的代码 - 两种情况都是空的。
如果未验证断言的表达式(a
),这里的重点是使编译器在编译时生气 :在这种情况下,扩展的宏将有两个{{1显式提供的那个,以及使用断言表达式结果的那个(所以,如果失败则为0);这导致case 0:
具有两个相同的switch
,这是不允许的,并使编译器在编译时停止并出现错误。
如果传递的表达式不是在编译时计算的常量(因为您不能具有运行时确定的case
值),这也将失败,这也是case
的预期值。