2011-01-01 6 views
1

コードは、次のセクションの数を持っている:彼らは、デバッグのために不可欠であり、(すべてのテスト構成のサポートなどをスレッド、I/Oを提供するために使用される)彼らは、コード内で複数回使用されているプリプロセッサマクロ:引数の挿入方法?

int filter; 
#ifdef INPUTFILTER_FOO 
LOG4CXX_DEBUG(log, "FOO filter used"); 
     filter = F_FOO; 
#endif 

年頃のが、コードを厳しく見せて、それぞれのcategory_type名前空間に1つずつ、マクロで置き換えます。だから、

、次のように展開したい:

MACROSTUFFBAZ(log2, stuff, "BAZ") < - テキスト部分には、クラスごとに一意であるので、それはあまりにもマクロに含まれる必要があります。マクロを定義するには

#ifdef INPUTSTUFF_BAZ 
    LOG4CXX_DEBUG(log2, "BAZ stuff used"); 
    stuff = S_BAZ; 
#endif 

、これを使用することを計画:へ

debug.hpp:

#ifdef INPUTSTUFF_BAZ 
    #define MACROSTUFFBAZ ... 
    #else 
    #define MACROSTUFFBAZ 
    .. no code! 
    #endif 
    #endif 

を(少なくともこれは、現在のものの明確な概要を提供します保護観察を受け、コードの周りを見ることなく)

+1

'filter = F_FOO'と' stuff = S_BAZ'については明確ではありません:いつ 'S_'ですか?いつそれが 'F_'ですか?それはマクロパラメータに依存しますか? – icecrime

+0

@icecrimeは、マクロ定義の値(ファイル名の接頭辞、カウンタ、遅延など)です。それらはパラメータに依存せず、代わりにマクロによって定義されます。 –

答えて

3

私は100%確かにそれが動作する場合、私は今、それをテストすることはできませんまた、別のコンパイラは、少し異なってプリプロセッサのマクロを処理します。しかし、私はこれが少なくともVisual Studioでうまくいくと思う。

基本的には、ヘルパーマクロを使用してパラメータを文字列に変換する必要があります。そして第二に、あなたは、識別子を連結する##を使用することができます。

#define PRMTOSTR_HLPR(x) #x 
#define PRMTOSTR(x) PRMTOSTR_HLPR(x) 

#ifdef INPUTSTUFF_BAZ 
    #define MACROSTUFFBAZ(A,B,C) \ 
    LOG4CXX_DEBUG(A, PRMTOSTR(C)" stuff used"); \ 
    B = S_##C; 
#else 
    #define MACROSTUFFBAZ(A,B,C) 
#endif 

//used like this: 
MACROSTUFFBAZ(log2, stuff, BAZ) 

編集:あなただけMACROSTUFFBAZの定義に直接#Cを置くことができるようにヘルパーマクロは、実際に、ここでは必要ありません。

+0

'#x'は正しいですが、ヘルパーマクロは必要ありません。 2番目のマクロに直接 '#C 'を置くことができます。文字列間のスペースもうまくいき、同じように連結されます。 –

+0

あなたは正しいです。間接指定の二重レベルが何かのために必要であることを思い出していましたが、他のマクロの値を引用するためのものでした:http://stackoverflow.com/questions/216875/in-macros/217181#217181 – Timo

関連する問題