#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.structintroduce un especificador de tipo elaborado por lo que puedo decir.+ ## 3para hacer+3. (Pero puede hacerlo,+ 3por 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,
begines reemplazado pordecode(a,n,i,m,a,t,e)decode(a,n,i,m,a,t,e)es reemplazado porm ## a ## i ## nm ## a ## i ## nes reemplazado pormainAsí, efectivamente,
begin()se reemplaza conmain().fuente