C中'switch 0'语句的目的是什么?

Jet*_*lue 4 c switch-statement

遇到了以下代码行,我无法弄清楚它的作用.

#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0)
Run Code Online (Sandbox Code Playgroud)

switch (0)部分做什么?假设0相当于false,这是否意味着我们永远不会进入switch语句?

同样对于该行case (a),您如何将未知a变量作为案例?

Mat*_*lia 6

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

这里的要点是如果未验证断言的表达式(),则编译器会在编译时生气a:在这种情况下,扩展宏将有两个case 0:- 显式提供的,以及使用断言表达式结果的宏()所以,0如果失败了); 这导致switch两个相同的case,这是不允许的,并使编译器在编译时停止错误.

如果传递的表达式不是在编译时计算的常量(因为您不能具有运行时确定的case值),这也将失败,这也是a期望的static_assert.