コンパイルエラーを意図的に発生させる#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__マクロおよびトークンの文字列化と結合を駆使せねばならず、移植性のあるコードを記述するのが大変になります。