Cでプリプロセッサ変数を印刷することはできますか?
-
05-07-2019 - |
質問
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, because pound is at the very left. #endif #ifdef BLAH3 #define BLAH4 // Works on many compilers, but is non-standard. #endif
すでに非標準の拡張機能を使用しているため、使用している特定のプリプロセッサ/コンパイラのドキュメントを参照して、「#warning」についての説明を確認する必要があります。
所属していません StackOverflow