58

#warningディレクティブが標準のC /C ++ではないことは知っていますが、gcc /g++を含むいくつかのコンパイラがそれをサポートしています。しかし、それをサポートしていない人にとって、彼らはそれを黙って無視するのでしょうか、それともコンパイルの失敗につながるのでしょうか?言い換えれば、それをサポートしていないコンパイラのビルドを壊すことなく、プロジェクトで安全に使用できますか?

4

6 に答える 6

78

MSVC は次の構文を使用することに注意してください。

#pragma message (「ここに警告テキスト」)

通常の #warning 構文では致命的なエラーが発生します

C1021: 無効なプリプロセッサ コマンド '警告'

したがって、それらのコンパイラには移植できません。

于 2008-11-11T00:30:06.230 に答える
31

コンパイラが#warningをサポートしていない場合、エラーが発生する可能性があります。#pragmaとは異なり、プリプロセッサが理解できないディレクティブを無視することはお勧めしません。

そうは言っても、私はさまざまな(かなり一般的な)プラットフォームでコンパイラーを使用しており、それらはすべて#warningをサポートしています。

于 2008-10-05T03:53:13.550 に答える
3

コードブロックがコンパイルに含まれていない場合でも、#warningを認識しないコンパイラから少なくとも認識されないディレクティブ警告が表示される可能性があります。それはエラーとして扱われるかもしれないし、扱われないかもしれません-コンパイラはそれを合法的にエラーとして扱うことができますが、多くはもっと緩いでしょう。

#warningを提供するGCC/G ++以外のコンパイラを知っていますか(名前を付けることができますか)?[編集: Sun Solaris 10(Sparc)とStudio 11 C /C++コンパイラはどちらも#warningを受け入れます。]

于 2008-10-05T03:56:31.780 に答える
1

Atmel プロセッサ用のコンパイラでこの問題が発生したことがあります。また、不明な #warning トークンが原因で、プリプロセッサ エラーが生成されました。

残念ながら、解決策は、ソース ツリー全体を #pragma と同等のものを使用するように変換し、gcc を使用するとビルドの動作が異なることを受け入れることのように思われました。

于 2008-10-05T04:20:20.343 に答える
1

mingw から Visual Studio に切り替えるときに、そのような行をグローバル構成ヘッダーに追加しました。(stdafx.h に含めます)

#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")

今、私は PRAGMA_WARNING を使用しています (これは修正する必要があります)

残念ながら gcc には存在#pragma warningしないため、未指定のプラグマを警告します。

#pragma warning"マイクロソフトが追加するのではなく、gccが追加するとは思えません#warning

于 2016-10-20T07:24:57.213 に答える
0

実際、私が知っているほとんどのコンパイラは、不明な#pragmaディレクティブを無視し、警告メッセージを出力します。したがって、最悪の場合でも、警告が表示されます。

于 2008-10-05T03:48:19.037 に答える