#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
Die obige Zeile stammt aus Unreal 4, und ich weiß, dass ich sie in den unwirklichen Foren nachfragen könnte, aber ich denke, dies ist eine allgemeine C ++ - Frage, die hier gestellt werden muss.
Ich verstehe, dass die erste Zeile ein Makro definiert, aber ich bin nicht gut mit Präprozessor-Spielereien in C ++ vertraut und deshalb bin ich dort verloren. Die Logik sagt mir, dass der Backslash bedeutet, dass die Deklaration in der nächsten Zeile fortgesetzt wird.
FThreadSafeStaticStat sieht ein bisschen wie eine Vorlage aus, aber da ist # los und eine Syntax, die ich noch nie in C ++ gesehen habe
Könnte mir jemand sagen, was das bedeutet? Ich verstehe, dass Sie möglicherweise keinen Zugriff auf Unreal 4 haben, aber es ist nur die Syntax, die ich nicht verstehe.
quelle
##
ist / könnte der Verkettungsoperator genannt werden.struct
führt, soweit ich das beurteilen kann, einen ausgeklügelten Typspezifizierer ein .+ ## 3
zu machen+3
. (Aber Sie können+ 3
natürlich ohne den Betreiber tun )Antworten:
##
ist der Präprozessoroperator für die Verkettung.Also, wenn Sie verwenden
DEFINE_STAT(foo)
irgendwo im Code wird es durch ersetzt
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
bevor Ihr Code kompiliert wird.
Hier ist ein weiteres Beispiel aus einem Blog-Beitrag von mir, um dies weiter zu erklären.
Dieses Programm würde erfolgreich kompilieren und ausführen und die folgende Ausgabe erzeugen:
Wenn der Präprozessor für diesen Code aufgerufen wird,
begin
wird ersetzt durchdecode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
wird ersetzt durchm ## a ## i ## n
m ## a ## i ## n
wird ersetzt durchmain
Somit wird effektiv
begin()
durch ersetztmain()
.quelle