syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

C/C++の#warning

コンパイルエラーを意図的に発生させる#errorプリプロセッサディレクティブに関しては、お馴染みの#includeや#defineなどと同様に言語仕様として標準化されているようで、おそらくすべてのC/C++処理系でサポートされています。

#ifdef __cplusplus
#error This code does not support C++!!
#endif

問題は警告のほうです。C/C++でユーザー定義の警告を発生させる方法は標準化されていません。
gccには#warningディレクティブが存在するのですが、Visual C++には存在しません。Clangにも存在しないようです。
#warningの実装は過去に提案されていたりするのですが、実現には至っていないようです。

#pragma messageはたいていの処理系でサポートされているのですが、単にメッセージを出力するだけで、警告にはならず、強制力がありません。

#ifdef NDEBUG
#pragma message("This code is compiled when release mode.")
#endif

また、#pragma messageでファイル名と行番号を出力しようとすると、__FILE__マクロと__LINE__マクロおよびトークンの文字列化と結合を駆使せねばならず、移植性のあるコードを記述するのが大変になります。

C#

一方、C#では#warningがちゃんと標準化されています。当然#errorもあります。

やはり本来は処理系ごとにどうにかするべき問題ではなく、C#のように言語仕様として標準化してほしい機能です。


え、Javaですか? そんな貧弱な言語は知りませんね。窓から投げ捨てましょう。

※2023-02-19追記:
C23およびC++23で、ついに#warningが標準化されるようです。

C#の登場から20年以上の歳月を費やし、ようやくその必要性を認めたようです。相変わらず遅すぎる。