#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
La línea anterior está tomada de Unreal 4, y sé que podría preguntarla en los foros de Unreal, pero creo que esta es una pregunta general de C ++ que merece ser formulada aquí.
Entiendo que la primera línea define una macro, sin embargo, no estoy bien versado en las travesuras del preprocesador en C ++, por lo que estoy perdido allí. La lógica me dice que la barra invertida significa que la declaración continúa en la siguiente línea.
FThreadSafeStaticStat se parece un poco a una plantilla, pero hay # allí y una sintaxis que nunca antes había visto en C ++
¿Alguien podría decirme qué significa esto? Entiendo que es posible que no tenga acceso a Unreal 4, pero es solo la sintaxis que no entiendo.
c++
c
concatenation
c-preprocessor
DavidColson
fuente
fuente
##
es / podría llamarse operador de concatenación.struct
introduce un especificador de tipo elaborado por lo que puedo decir.+ ## 3
para hacer+3
. (Pero puede hacerlo,+ 3
por supuesto, sin el operador)Respuestas:
##
es el operador del preprocesador para la concatenación.Entonces, si usas
DEFINE_STAT(foo)
en cualquier parte del código, se reemplaza con
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
antes de que se compile su código.
Aquí hay otro ejemplo de una publicación de mi blog para explicar esto con más detalle.
#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"); }
Este programa se compilaría y ejecutaría con éxito y produciría el siguiente resultado:
Stumped?
Cuando se invoca el preprocesador en este código,
begin
es reemplazado pordecode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
es reemplazado porm ## a ## i ## n
m ## a ## i ## n
es reemplazado pormain
Así, efectivamente,
begin()
se reemplaza conmain()
.fuente