[〜#〜] c [〜#〜]のプリプロセッサ変数の値をstderrに出力することは可能ですか?たとえば、私が今持っているのは:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR is greater than 10
#endif
しかし、私がしたいのは:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR=%PP_VAR%
#endif
[〜#〜] c [〜#〜]でこのようなことは可能ですか?
Visual Studioでプリプロセッサ変数の値を出力できます。次は、_MSC_VERの値を出力します。
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message(STRING(_MSC_VER))
これがどれほど標準的かはわかりません。
これはGCC 4.4.3で動作します。
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)
利回り:
src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017
多くのCコンパイラは#warning
をサポートしています(ただし、C標準では定義されていません)。
ただし、GCCは少なくとも後続のデータに対して前処理を行わないため、変数の値を確認することは困難です。
#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR
GCCが生成するもの:
x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR
プリプロセッサーのトークン貼り付け演算子を使用:## TOKEN_NAME
前述のように、使用しているプリプロセッサディレクティブは非標準なので、YMMVです。
まあ、あなたがやっていることは実際には非標準です。まず、「#warning」または「#warn」ディレクティブは標準ではありません。次に、プリプロセッサを使用する場合、行はスペースなしでポンド記号で始まる必要があります。
#ifdef BLAH1 #define BLAH2 //ポンドが左端にあるため、OK。 #endif #ifdef BLAH3 #define BLAH4 //多くのコンパイラで動作しますが、標準ではありません。 #endif
すでに非標準の拡張機能を使用しているため、使用している特定のプリプロセッサ/コンパイラのドキュメントを調べて、「#warning」についての説明を確認する必要があります。