#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
La ligne ci-dessus est tirée d'Unreal 4, et je sais que je pourrais la poser sur les forums irréels, mais je pense que c'est une question C++ générale qui mérite d'être posée ici.
Je comprends que la première ligne définit une macro, mais je ne connais pas bien les manigances de préprocesseur en C++ et donc je suis perdu là-bas. La logique me dit que la barre oblique inverse signifie que la déclaration continue sur la ligne suivante.
FThreadSafeStaticStat ressemble un peu à un modèle, mais il y a un # là-dedans et une syntaxe que je n'ai jamais vue auparavant en C++
Quelqu'un pourrait-il me dire ce que cela signifie? Je comprends que vous n'avez peut-être pas accès à Unreal 4, mais c'est juste la syntaxe que je ne comprends pas.
##
Est l'opérateur de préprocesseur pour la concaténation.
Donc, si vous utilisez
DEFINE_STAT(foo)
n'importe où dans le code, il est remplacé par
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
avant que votre code ne soit compilé.
Voici un autre exemple de n article de blog à moi pour l'expliquer davantage.
#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");
}
Ce programme serait compilé et exécuté avec succès, et produirait la sortie suivante:
Stumped?
Lorsque le préprocesseur est appelé sur ce code,
begin
est remplacé par decode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
est remplacée par m ## a ## i ## n
m ## a ## i ## n
Est remplacé par main
Ainsi, en fait, begin()
est remplacée par main()
.