我正在开发一个使用 VC9 构建的应用程序,但我遇到了一个我不完全理解的警告:为什么在构造函数的右括号上有一个“无法访问的代码”警告?
重现该问题的最小测试用例是:
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
foo();
} // d:\foo.cpp(7) : warning C4702: unreachable code
};
int main() {
A a;
}
这必须用 /W4 编译以触发警告。或者,您可以使用 /we4702 进行编译,以在检测到此警告时强制出错。
d:\>cl /c /W4 foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo.cpp
d:\foo.cpp(7) : warning C4702: unreachable code
有人可以准确地解释一下这里无法到达的地方吗? 我最好的理论是它是析构函数,但我想要一个明确的答案。
如果我想让这段代码警告干净,我该如何实现呢? 我能想到的最好的方法是将其转换为编译时错误。
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
编辑:为澄清起见,使用 noreturn 函数终止程序通常不会在包含该函数调用的右大括号上导致无法访问的代码警告。
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
结果是:
d:\>cl /c /W4 foo3.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo3.cpp