15

残りのコードを前もって追加したテスト用のコードがあるので、テストで残りのコードに到達することはありません。警告レベル4が設定されているため、これによりc4702:到達不能コード警告が発生します。

私はこのように無効にしてみました:

//do something
    return 0;

    /*-------------------------------------------------------------------------*/

#pragma warning(disable: 4702)
    //real code

しかし、コンパイラはまだうめき声を上げます。そして、私はすべての警告をエラーとして扱うように設定しているので、これはコンパイルされません...

Visual Studio2012Premiumを使用しています...

どんな助けでも喜んでいただければ幸いです。

4

2 に答える 2

26

影響を受ける関数の内部ではなく、開始前にプラグマを配置する必要があるかもしれません。

MSDNドキュメントから:

コード生成に関連付けられている4700〜4999の範囲の警告番号の場合、コンパイラーが関数の開いた中括弧に遭遇したときに有効な警告の状態は、残りの関数に対して有効になります。関数で警告プラグマを使用して、4699より大きい数の警告の状態を変更すると、関数の終了後にのみ有効になります。

したがって、たとえば:

#pragma warning(push)
#pragma warning(disable: 4702)
bool Do() {
  return true;
  return true;  // No warning generated
#pragma warning(pop)
}

bool DoDo() {
  return true;
  return true;  // Generates C4702
}
于 2012-09-12T04:15:23.213 に答える
1

これは、MSDNドキュメントhttps://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/2c8f766e(v=vs.110)?redirectedfrom=MSDNからもVisualStudio2013に適用されます( ExpressエディションとProエディションの両方)。

文章:

警告2012年7月11日読むのに3分コンパイラの警告メッセージの動作を選択的に変更できるようにします。

#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...] ) 
#pragma warning( push[ ,n ] ) 
#pragma warning( pop )

備考以下の警告指定パラメータが利用可能です。

表1警告指定子

意味

1、2、3、4

指定されたレベルを指定された警告に適用します。これにより、デフォルトでオフになっている指定された警告もオンになります。

デフォルト

警告動作をデフォルト値にリセットします。これにより、デフォルトでオフになっている指定された警告もオンになります。警告は、デフォルトの文書化されたレベルで生成されます。

詳細については、デフォルトでオフになっているコンパイラの警告を参照してください。

無効にする

指定された警告メッセージを発行しないでください。

エラー

指定された警告をエラーとして報告します。

一度

指定したメッセージを1回だけ表示します。

抑制

プラグマの現在の状態をスタックにプッシュし、次の行の指定された警告を無効にしてから、警告スタックをポップして、プラグマの状態をリセットします。

次のコードステートメントは、warning-number-listパラメーターに複数の警告番号を含めることができ、同じプラグマディレクティブで複数のwarning-specifierパラメーターを指定できることを示しています。

#pragma warning( disable : 4507 34; once : 4385; error : 164 )

これは、次のコードと機能的に同等です。

// Disable warning messages 4507 and 4034.
#pragma warning( disable : 4507 34 )

// Issue warning 4385 only once.
#pragma warning( once : 4385 )

// Report warning 4164 as an error.
#pragma warning( error : 164 )

コンパイラーは、0から999の間の警告番号に4000を追加します。

コード生成に関連付けられている4700〜4999の範囲の警告番号の場合、コンパイラーが関数の開いた中括弧に遭遇したときに有効な警告の状態は、残りの関数に対して有効になります。関数で警告プラグマを使用して、4699より大きい数の警告の状態を変更すると、関数の終了後にのみ有効になります。次の例は、コード生成警告メッセージを無効にしてから復元するための警告プラグマの正しい配置を示しています。

// pragma_warning.cpp
// compile with: /W1
#pragma warning(disable:4700)
void Test() {
   int x;
   int y = x;   // no C4700 here
   #pragma warning(default:4700)   // C4700 enabled after Test ends
}

int main() {
   int x;
   int y = x;   // C4700
}

関数本体全体で、警告プラグマの最後の設定が関数全体で有効になることに注意してください。

プッシュアンドポップ警告プラグマは、次の構文もサポートしています。

#pragma warning( push [ ,n ] )

#pragma warning( pop )

ここで、nは警告レベル(1から4)を表します。

プラグマwarning(push)は、すべての警告の現在の警告状態を格納します。プラグマwarning(push、n)は、すべての警告の現在の状態を格納し、グローバル警告レベルをnに設定します。

プラグマwarning(pop)は、スタックにプッシュされた最後の警告状態をポップします。プッシュとポップの間に警告状態に加えた変更はすべて元に戻されます。この例を考えてみましょう。

#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
// Some code
#pragma warning( pop ) 

このコードの最後で、popはすべての警告(4705、4706、および4707を含む)の状態をコードの最初の状態に復元します。

ヘッダーファイルを作成するときは、プッシュとポップを使用して、ユーザーが警告状態を変更してもヘッダーが正しくコンパイルされないようにすることができます。ヘッダーの最初でpushを使用し、最後でpopを使用します。たとえば、警告レベル4で正常にコンパイルされないヘッダーがある場合、次のコードは警告レベルを3に変更し、ヘッダーの最後で元の警告レベルを復元します。

#pragma warning( push, 3 )
// Declarations/definitions
#pragma warning( pop ) 

警告を抑制するのに役立つコンパイラオプションの詳細については、/FIおよび/wを参照してください。

関連項目参照プラグマディレクティブおよび__Pragmaキーワード

于 2020-03-26T14:37:55.167 に答える