web-dev-qa-db-ja.com

Cでプリプロセッサ変数を出力することは可能ですか?

[〜#〜] 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 [〜#〜]でこのようなことは可能ですか?

45
apalopohapa

Visual Studioでプリプロセッサ変数の値を出力できます。次は、_MSC_VERの値を出力します。

#define STRING2(x) #x
#define STRING(x) STRING2(x)

#pragma message(STRING(_MSC_VER))

これがどれほど標準的かはわかりません。

57
MattM

これは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
13
Marc Abramowitz

多くの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
5

プリプロセッサーのトークン貼り付け演算子を使用:## TOKEN_NAME

前述のように、使用しているプリプロセッサディレクティブは非標準なので、YMMVです。

3
rtenhove

まあ、あなたがやっていることは実際には非標準です。まず、「#warning」または「#warn」ディレクティブは標準ではありません。次に、プリプロセッサを使用する場合、行はスペースなしでポンド記号で始まる必要があります。

#ifdef BLAH1 
#define BLAH2 //ポンドが左端にあるため、OK。
#endif 
 
#ifdef BLAH3 
 #define BLAH4 //多くのコンパイラで動作しますが、標準ではありません。
#endif 

すでに非標準の拡張機能を使用しているため、使用している特定のプリプロセッサ/コンパイラのドキュメントを調べて、「#warning」についての説明を確認する必要があります。