![]() |
1
4
这是g++静态分析器的一个缺点。它没有得到所有枚举值都在switch语句中正确处理的事实。 你可以注意到这里 https://godbolt.org/z/LQnBNi 当向枚举中添加另一个值时,该叮当声不会对当前形状中的代码发出任何警告,并发出两个警告(“并非所有枚举值都在switch中处理”和“控件到达非void函数的结尾”)。 请记住,编译器诊断并不是以任何方式标准化的—编译器可以自由地报告一致性代码的警告,并报告警告(和编译!)对于一个错误的程序。 |
![]() |
2
4
你必须记住C++中的
|
![]() |
3
1
首先,您描述的是警告,而不是错误消息。编译器不需要发出这样的警告,而且仍然可以成功编译您的代码,因为它在技术上是有效的。
在linux下,这是“从来没有问题”的唯一原因是您选择的编译器没有配置(或与合适的命令行选项一起使用)来发出警告。
由于这样的分析,大多数编译器能够并且确实检测出可能有问题的情况,即使代码没有可诊断的错误(即“足够正确”,C++标准不需要诊断)。 在这种情况下,编译器可能会得出许多不同的结论,这取决于它如何进行分析。
如果编译器的分析进行到这一步(并且编译器被配置为对此类事件发出警告),则满足发出警告的条件。如果可以抑制警告,则需要进一步分析,例如,确定
在这两种情况下,都不会进行分析以确定可以抑制警告,因此不会抑制警告。编译器将没有做足够的分析来确定通过函数的所有执行路径都遇到错误
最后,您需要将编译器警告视为潜在问题的标志,然后对潜在问题是否值得关注做出明智的决定。这里的选项包括抑制警告(例如,使用命令行选项使警告被抑制)、修改代码以防止警告(例如,添加
|
![]() |
4
0
省略return语句时应该非常小心。这是一种未定义的行为:
考虑到这段代码是好的,因为所有有效的枚举值(在本例中是在
此外,来自 SergeyA's answer 显示这类代码是一个直接的定时炸弹:
只需添加第三个枚举成员(并在
因此,经验法则是以所有路径都以
|
![]() |
ZenBa2 · getopt未更改值C 3 年前 |
![]() |
Waeez · 条件未满足php仍在运行 7 年前 |
![]() |
Catz · 正在尝试打印正确数量的“*”以代替数值 7 年前 |
|
privilegedMale · switch语句中的扫描仪问题 7 年前 |
![]() |
rasilvap · 具有多个参数的开关箱 7 年前 |
![]() |
RudziankoÅ · 不可能的类型切换情况:不能有动态类型 7 年前 |
![]() |
Leo Thomas · 循环case语句而不退出shell脚本 7 年前 |