2017-07-29 9 views
2

C++でビルドされたCコードベースで警告レベルを上げようとしています。私はVisual Studioに何らかの理由でショットを与えています。MSVC警告4611 setjmp w/POD構造体

関連するデストラクタが表示されていないにもかかわらず、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完全最適化/ Ox test.cpp')でも警告が出ます。 :-( – HostileFork

+1

私は考えているのではないかと心配していますが、PODを起動すると警告が役に立たないというあなたの評価に同意します – zwol

答えて

0

この警告は、基本的に「setjmpをC++プログラムで使用しました」という点でこの警告に当てはまりましたか?

そうであるように見えます。

私はおそらくそれをバグとして分類します。しかし、マイクロソフトのWebサイトではmake a suggestionがより簡単でした。提案は投票できます。