#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
Powyższa linia pochodzi z Unreal 4 i wiem, że mógłbym zadać to pytanie na nierealnych forach, ale myślę, że jest to ogólne pytanie C ++, które zasługuje na to, aby je tutaj zadać.
Rozumiem, że pierwsza linia definiuje makro, jednak nie jestem dobrze zaznajomiony z oszustwami preprocesora w C ++, więc pogubiłem się. Logika mówi mi, że odwrotny ukośnik oznacza, że deklaracja przechodzi do następnej linii.
FThreadSafeStaticStat wygląda trochę jak szablon, ale dzieje się tam # i składnia, której nigdy wcześniej nie widziałem w C ++
Czy ktoś mógłby mi powiedzieć, co to oznacza? Rozumiem, że możesz nie mieć dostępu do Unreal 4, ale to tylko składnia, której nie rozumiem.
c++
c
concatenation
c-preprocessor
DavidColson
źródło
źródło
##
jest / można by nazwać operatorem konkatenacji.struct
wprowadza rozbudowany specyfikator typu .+ ## 3
zrobić+3
. (Ale możesz to zrobić+ 3
oczywiście bez operatora)Odpowiedzi:
##
jest operatorem preprocesora do konkatenacji.Więc jeśli używasz
DEFINE_STAT(foo)
w dowolnym miejscu kodu zostanie zastąpiony przez
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
zanim Twój kod zostanie skompilowany.
Oto kolejny przykład z mojego posta na blogu, aby to wyjaśnić.
#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"); }
Ten program skompilowałby się i wykonałby pomyślnie i dałby następujący wynik:
Stumped?
Gdy preprocesor jest wywoływany w tym kodzie,
begin
jest zastępowany przezdecode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
jest zastępowany przezm ## a ## i ## n
m ## a ## i ## n
jest zastępowany przezmain
W ten sposób skutecznie
begin()
zastępujemain()
.źródło