【发布时间】:2021-12-13 12:24:11
【问题描述】:
考虑下面的 sn-p。如果我用 GCC/C++11 编译它,那么我希望如果我用例如调用它var=2 该块已执行。无论如何,我希望至少调用 3 个 switch 块中的一个。
但是我得到的只是“开始”和“结束”行。 所以这个开关块不起作用:甚至没有调用“默认”。当我看到这个时我什至不相信 GDB!
其根本原因是案例块 1 (int anotherVar) 中的变量声明。为了解决这个问题,我需要在案例 1(自己的范围)周围添加括号,或者在顶部的构造函数主体中声明变量。
我的问题是:
- 为什么会这样?技术原因是什么?如果不是在所有情况下都发生这种情况,那么在哪些情况下会发生这种情况?
- 是否有编译器错误/警告标志?
MyClass::MyClass(int var) {
std::cout << "Constructor start" << std::endl;
switch (var) {
case 1:
std::cout << "Case 1 executed" << std::endl;
int anotherVar = doSomething();
case 2:
std::cout << "Case 2 executed" <<std::endl;
break;
default:
std:cout << "Default executed" << std::endl;
}
std::cout << "Constructor ended" << std::endl;
}`
使用var=2 调用时会输出:
Constructor start
Constructor ended
【问题讨论】:
-
能否请您发布所有代码
-
最新的 g++ 不会按原样编译您的代码,因此它比警告要好。较旧的 g++ 似乎需要
-fpermissive来编译此代码。 -
switch case大多只是标签(
goto使用的),变量的定义和使用对goto/label有一定的限制(int anotherVar范围不限于@987654330 @)。 -
只是提示:更改行 std::cout