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

6
我发现了以下代码行,但我无法弄清它的作用。

偶然发现了这行代码,但我无法弄清它的作用。

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

switch (0)是假设0等同于false的情况下,进入switch语句后不会执行任何case分支。

对于case (a)这一行,你可以将未知的变量a作为一个case选项。


3
这段代码似乎只是检查a是否为编译时常量。b甚至没有被使用。它展开后的代码只是简单地跳过,没有真正做任何事情。 switch(0)switch(100)或其他任何值没有区别。它会跳转到case 0,然后从那里继续执行。而且a不应该是一个变量,它应该是您传递给宏的任何常量。如果传递了一个变量,您将收到一个编译时错误。 - Tom Karzes
3
static_assert 可以给你一些提示,尽管这里的意图和用法不同,而且这个名称也不是一个好的选择。 - phuclv
3
标准库的static_assert实现有缺陷,因为它在函数外部无法工作。 - M.M
1个回答

8
switch(0) 将始终执行与 case 0: 相关联的代码块; 不过,在这里,没有实际执行的代码-两个情况都是空的。
重点在于使编译器在编译时对断言表达式 (a) 进行验证失败时发怒: 在这种情况下,扩展的宏将具有两个 case 0: - 显式提供的一个和使用断言表达式的结果的一个(所以,如果失败了,则为0); 这会导致带有两个相同 caseswitch,这是不允许的,会使编译器在编译时停止并显示错误。
如果传递的表达式不是在编译时计算的常量(因为您不能具有运行时确定的 case 值),那么这也会失败,这也是从 static_assert 中预期的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接