Was macht ## (Double Hash) in einer Präprozessordirektive?

Was macht ## (Double Hash) in einer Präprozessordirektive?


#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

Die obige Zeile stammt aus Unreal 4, und ich weiß, ich könnte sie in den Unreal-Foren stellen, aber ich denke, dies ist eine allgemeine C++-Frage, die hier gestellt werden sollte.


Ich verstehe, dass die erste Zeile ein Makro definiert, aber ich kenne mich mit Präprozessor-Spielereien in C++ nicht aus und bin daher dort verloren. Die Logik sagt mir, dass der umgekehrte Schrägstrich bedeutet, dass die Deklaration in der nächsten Zeile fortgesetzt wird.


FThreadSafeStaticStat sieht ein bisschen wie eine Vorlage aus, aber da sind #s drin und eine Syntax, die ich noch nie zuvor in C++ gesehen habe


Kann mir jemand sagen was das bedeutet? Ich verstehe, dass Sie möglicherweise keinen Zugriff auf Unreal 4 haben, aber ich verstehe nur die Syntax nicht.


Antworten:


## ist der Präprozessoroperator für die Verkettung.


Wenn Sie also

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 Blogbeitrag von mir, um dies weiter zu erläutern.


#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)
int begin()
{
printf("Stumped?\n");
}

Dieses Programm würde erfolgreich kompiliert und ausgeführt werden und die folgende Ausgabe erzeugen:


Stumped?

Wenn der Präprozessor für diesen Code aufgerufen wird,



  • begin wird durch decode(a,n,i,m,a,t,e) ersetzt

  • decode(a,n,i,m,a,t,e) wird durch m ## a ## i ## n ersetzt

  • m ## a ## i ## n wird durch main ersetzt


Also effektiv begin() wird durch main() ersetzt .