In diesem speziellen Bit des Codes, der Autor tut etwas klug, indem ein Makro verwendet, um Incrementor-Funktionen für alle Mitglieder der Klasse COUNTER zu erstellen.Warum wird das doppelte Pfund an einem Ort benötigt, aber nicht die anderen in diesem Makro?
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)
Ich bin ein wenig verwirrt durch das Makro, obwohl. Warum verwendet der Autor das doppelte Pfund im Funktionsdefinitionsteil des Makros und nicht, wenn es als die Klassenvariable verwendet wird, die inkrementiert wird?
EDIT: ich, dass die Doppel Pfund für Verkettung ist, aber meine Verwirrung kommt von, warum die Doppel Pfund nicht notwendig in der ist und „CountTaken was ++.“ Teile „CountSeen was ++.“ .
Kurze Antwort: Doppel-Pfundzeichen ('##') ist der Präprozessor-Operator für die Verkettung. – DimChtz