2
尝试在也构建为C++的C代码库上显示一些警告级别。我给了Visual Studio一个镜头(出于某种原因)。有关setjmp w/POD的MSVC警告4611结构
尽管没有看到任何相关的析构函数,但仍发现有关setjmp交互的警告。所以我做了试验:
#include <setjmp.h>
struct X { int y; };
int main() {
struct X x;
jmp_buf buf;
if (setjmp(buf) == 0) {
longjmp(buf, 1);
} else {
// whatever.
}
}
在命令行启用警告:
C:\wherever>cl /we4611 test.cpp
TEST.CPP TEST.CPP(9):错误C4611: '_setjmp' 之间的相互作用和C++对象销毁是不可移植的
这似乎是一个非常有用的警告 - 如果它警告我关于跨C++析构函数代码。但这是一种POD类型。不应该有任何析构函数代码。
我是否在这里丢失了一些东西,或者他们把这个警告弄糊涂到基本上“你在C++程序中使用过setjmp”了?
如果您启用优化,该警告神秘消失吗? (这个特定的诊断可能对编译器是否已经注意到某种类型是POD非常敏感,并且在注意“编译时间最短”缺省模式时可能没有这么小心)。 – zwol
@zwol通过完全优化('cl/we4611/Ox test.cpp')它仍然会给出警告。 :-( – HostileFork
恐怕那是我的想法,然后,我同意你的评价,如果它在PODs上触发这个警告是毫无价值的 – zwol