8

次の質問を読みましたが、答えは十分に明確に見えます 。Cプリプロセッサと2回連結し、「arg ## _ ## MACRO」のようにマクロを展開する方法は?

しかし、VARIABLEの最後にドットがある場合はどうなりますか?

デバッグの目的で構造体のカウンターをインクリメントする単純なマクロを実行しようとしています。上記の質問の助けがなくても、簡単にこれを行うことができます

#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

私は得る

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

では、これをどのように変更すればよいのでしょうか。

DEBUG_INC_COUNTER(var);

生成します

debugObj.var++;

4

2 に答える 2

9

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

于 2012-04-10T08:54:17.047 に答える
7

##を使用してdebugObj .、およびvar1個別のプリプロセッサトークンとしてそれらを一緒に貼り付けないでください。

以下が機能するはずです。

#define DEBUG_INC_COUNTER(x) debugObj.x++
于 2012-04-10T08:52:36.403 に答える