3

問題

私は空のステートメントを使用し、それを認識しています。では、コンパイラの警告を無効にするにはどうすればよいですか?

警告 C4390: ';' : 空の制御ステートメントが見つかりました。これは意図ですか?

空のステートメントが欲しいと明示的に言う方法があるかもしれません。

バックグラウンド

開発環境では、デバッグ機能はエラー メッセージを表示し、アプリケーションを終了する必要があります。生産的なリリースでは、何もしません。というわけでマクロを書いてみました。

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif
4

5 に答える 5

4

空のステートメント マクロの一般的なイディオムは次のとおりです。

#define Debug(text) do {} while (0)

Ben がコメントで指摘しているように、両方のバージョンのマクロでこの手法を使用するのが賢明です。

#ifdef _DEBUG
#include <iostream>
#define Debug(text) do { cout << "Error: " << text; cin.get(); exit(1); } while (0)
#else
#define Debug(text) do {} while (0)
#endif

このイディオムは多くの場所で議論されています。例えば:

于 2012-12-18T18:42:00.850 に答える
3

何もしていないことをコンパイラに明示的に伝えることができます

(void)0;
于 2012-12-18T18:47:45.797 に答える
0

Debug関数のようなマクロとして使用されますが、そのようには動作しません:

if( some_condition ) Debug(); else { blah }    // Ooops

また、標準出力ストリームを台無しにし、デバッグ ビルドとリリース ビルド用に異なるヘッダーを含め、予約済みのシンボル (アンダースコアで始まり、大文字が続く)_DEBUGを使用し (標準を使用するつもりでしたNDEBUGか?)、不必要に非標準の終了値を使用します。

したがって、現在の代わりに

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif

行う

#ifndef DEBUGGING_H
#define DEBUGGING_H

#include <iostream>      // std::cerr, std::endl
#include <stdlib.h>      // exit, EXIT_FAILURE

#ifdef MYDEBUG
#   define Debug(text) ::debugging::sayByeAndTerminate( text )
#else
#   define Debug(text)
#endif

namespace debugging {
    inline void sayByeAndTerminate( char const* const text )
    {
        using namespace std;
        cerr << "Error: " << text; cin.get(); exit(EXIT_FAILURE);
    }
}  // namespace debugging

上記のコードは愚か

do {} while( false )

二重愚かでもない

(void)0

何も得られないためだけに何かを書く必要はないからです。

完全に良いものなどありません。

警告について: Visual C++ 11 で再現することはできません (動作を示す完全な例を提供しください) 。これでコンパイラに対応するようにコードを調整しないでください。警告をオフにするだけです。

免責事項: すぐに使えるコードであり、コンパイラの手には触れられていません。

于 2012-12-18T18:54:05.270 に答える
0

コンパイルの警告を無効にする別の方法は、コードの先頭に次のコードを追加することです。

#pragma warning( disable : 4390 )
于 2021-10-26T09:08:09.980 に答える