この特定のコードでは、マクロを使用してCOUNTERクラスのすべてのメンバーに対してインクリメンタ関数を作成することにより、巧妙なことを行います。ダブルポンドはなぜこの場所には必要ですか?
class COUNTER
{
public:
UINT64 _call;
UINT64 _call_indirect;
UINT64 _return;
UINT64 _syscall;
UINT64 _branch;
UINT64 _branch_indirect;
COUNTER() : _call(0),_call_indirect(0), _return(0), _branch(0), _branch_indirect(0) {}
UINT64 Total()
{
return _call + _call_indirect + _return + _syscall + _branch + _branch_indirect;
}
};
COUNTER CountSeen;
COUNTER CountTaken;
#define INC(what) VOID inC## what (INT32 taken) { CountSeen. what ++; if(taken) CountTaken. what ++;}
INC(_call)
INC(_call_indirect)
INC(_branch)
INC(_branch_indirect)
INC(_syscall)
INC(_return)
私はマクロによって少し混乱しています。著者がマクロの関数定義部分でダブルポンドを使用し、インクリメントされるクラス変数として使用されていないときはどうしてですか?
編集:私は二重のポンドは、連結のためのものであることを得るが、私の混乱は、二重ポンドは 「CountSeen何++。」 と 「CountTaken何++。」 部分では不要である理由から来ています。
短い答え:ダブルポンド記号( '##')は、連結のためのプリプロセッサ演算子です。 – DimChtz