2017-07-29 22 views
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”了?

+0

如果您启用优化,该警告神秘消失吗? (这个特定的诊断可能对编译器是否已经注意到某种类型是POD非常敏感,并且在注意“编译时间最短”缺省模式时可能没有这么小心)。 – zwol

+0

@zwol通过完全优化('cl/we4611/Ox test.cpp')它仍然会给出警告。 :-( – HostileFork

+1

恐怕那是我的想法,然后,我同意你的评价,如果它在PODs上触发这个警告是毫无价值的 – zwol

回答

0

他们是否把这个警告弄糊涂到基本上“你在C++程序中使用过setjmp”了?

看起来是这样。

我可能会把它归类为一个bug,我自己。但是在微软网站上更容易make a suggestion。建议可以投票,那里...