Cプリプロセッサからメッセージを出力するポータブルな方法はありますか?


回答:


114

このwarningディレクティブはおそらく最も近いものですが、プラットフォームに完全に依存しているわけではありません。

#warning "C Preprocessor got here!"

これは、MSVCを除くほとんどのコンパイラで機能します。MSVCでは、pragmaディレクティブを使用する必要があります。

#pragma message ( "C Preprocessor got here!" )

5
どちらが問題を引き起こすか、どうにかして「プラグマメッセージ」と「警告」を交換するコンパイルフラグに基づくディレクティブを置くことができますか?たとえば、次のようなものです#ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"。...試してみる必要がありますが、本能は答えがノーだと教えてくれます。
ブライアン

11
@ブライアン:はい。#define WARNING(msg) _Pragma("message " #msg)
Matt Joiner

1
#pragma message()は、古いバージョンのgcc(RHEL5のデフォルトバージョンであるgcc 4.1.2など)ではサポートされていません。これらの古いバージョンに相当する適切なものをまだ見つけていません-#warningは素晴らしいことではありません。警告は一般的にエラーとして扱われ、コンパイルを停止するのではなく、メッセージを情報として提供したいからです。
ダニーS

6
デフォルトで-Wallを使用してプロジェクトをコンパイルする場合、警告の発行は非常に不便です。#pragmaメッセージにはその問題はありません。
Renan Gemignani 2017

56

以下は、MSVCおよびGCCでサポートされています。

#pragma message("stuff")
#pragma message "stuff"

Clangは最近サポートを追加し始めました。詳細については、こちらを参照てください。


3
参考までに、Solaris Studio 12.3(Sun C 5.12)はこのプラグマをサポートしていません。
maxschlepzig

Visual Studio vMicroを使用してArduino 1.8で動作します。ありがとう!
save_jeff

12

あなたが試してみたいかもしれません: #pragma message("Hello World!")


9

ほとんどのCコンパイラは#warningディレクティブを認識するため、

 #warning "Got here"

標準の「#error」ディレクティブもあります。

 #error "Got here"

すべてのコンパイラがサポートしていますが、コンパイル/前処理も停止します。


6
#pragma message("foo")

よく働く。-Werrorを使用してもコンパイルを停止しません


0

別の解決策は、コメントとシェルスクリプトを使用してコメントを処理することです。これにはある程度の規律が必要です(またはタイプミスを検出するシェルスクリプト)。

たとえば、フォーマットされたコメントを追加//TODOしてから、それらすべてをレポートに収集するシェルスクリプトを追加します。

より複雑なユースケースでは、独自の単純なプリプロセッサを作成してみてください。たとえば、ソースを*.c2ファイルとして編集できます。単純なプリプロセッサは、ソースを読み取り、を探し、出力ファイルに//TODO書き込みます。printf("TODO ...")*.c


-17

できません。プリプロセッサはCコードの前に処理されます。画面に出力するプリプロセッサディレクティブはありません。プリプロセッサコードは実行されないため、実行可能コードにコンパイルされるCコードを生成するために使用されます。

何か問題があります:

#ifdef ...
printf("Hello");
#endif

これは、プリプロセッサが実行できる限り実行できるすべてです。


5
これはコンパイル時に出力されません。これは、OPが探しているものと考えています。
ボブカウフマン

私は彼が実行時の印刷を意味していると思いました。
Alexander Rafferty、2010

1
コンパイル時間について尋ねていました。ありがとう!
Andrew Wagner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.