質問

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」についての説明を確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top