2012-04-10 2 views
5

私は、次の質問を読んで、答えは十分に明確なようだ: How to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"?Cプリプロセッサで文字列を連結するにはどのようにドットを入れますか?

しかし、どのような変数が最後にドットがある場合は?

私は、デバッグの目的で構造体のカウンタをインクリメントする単純なマクロを実行しようとしています。私は簡単に、単純に

#ifdef DEBUG 
#define DEBUG_INC_COUNTER(x) x++ 
#endif 

でも、上記の質問からの助けなしにこれを行うと

DEBUG_INC_COUNT(debugObj.var1); 

しかし、追加、それを呼び出すことができます「debugObjを。」すべてのマクロに非常に冗長なようです。私は連結しようとする場合は:?

#define VARIABLE debugObj. 
#define PASTER(x,y) x ## y++ 
#define EVALUATOR(x,y) PASTER(x,y) 
#define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x) 
DEBUG_INC_COUNTER(var) 

gcc -E macro.c 

を私は

DEBUG_INC_COUNTER(var); 

debugObj.var++; 

を生成するように、どのように私はこれを変更する必要があり

macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token 

を取得しますか

答えて

5

省略##。これは、文字列を結合する場合にのみ必要です。引数は文字列ではないので、それらの間のスペースは重要ではありません(debugObj . var1debugObj.var1と同じです)。

+0

D'oh!私はあまりにも賢い。 – Makis

4

別々のプリプロセッサトークンとしてdebugObj.var1を持つことができるので、##を使用してそれらを一緒に貼り付けるべきではありません。

次は動作するはず

#define DEBUG_INC_COUNTER(x) debugObj.x++ 
+0

あなたの編集はあなたの答えをクリアしました。アーロンの答えは最初は私にはっきりしていました。私はあなたの編集を見る前にそれを受け入れました。 – Makis

+0

私と一緒に罰...幸運! – Lindydancer