#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
Baris di atas diambil dari Unreal 4, dan saya tahu saya bisa menanyakannya di forum yang tidak nyata, tapi saya pikir ini adalah pertanyaan C ++ umum yang perlu ditanyakan di sini.
Saya mengerti baris pertama mendefinisikan makro, namun saya tidak berpengalaman dalam preprocessor shenanigans di C ++ dan jadi saya tersesat di sana. Logika memberitahu saya bahwa garis miring terbalik berarti deklarasi berlanjut ke baris berikutnya.
FThreadSafeStaticStat terlihat seperti template, tetapi ada # yang terjadi di sana dan sintaks yang belum pernah saya lihat sebelumnya di C ++
Bisakah seseorang memberi tahu saya apa artinya ini? Saya memahami bahwa Anda mungkin tidak memiliki akses ke Unreal 4, tetapi itu hanya sintaks yang saya tidak mengerti.
c++
c
concatenation
c-preprocessor
DavidColson
sumber
sumber
##
adalah / bisa disebut operator penggabungan.struct
memperkenalkan penentu tipe yang rumit sejauh yang saya tahu.+ ## 3
untuk membuat+3
. (Tapi+ 3
tentu saja Anda dapat melakukannya , tanpa operator)Jawaban:
##
adalah operator preprocessor untuk penggabungan.Jadi jika Anda menggunakan
DEFINE_STAT(foo)
di mana saja dalam kode, itu akan diganti dengan
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
sebelum kode Anda dikompilasi.
Berikut adalah contoh lain dari posting blog saya untuk menjelaskan ini lebih lanjut.
#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"); }
Program ini akan berhasil dikompilasi dan dijalankan, dan menghasilkan keluaran sebagai berikut:
Stumped?
Ketika preprocessor dipanggil pada kode ini,
begin
diganti dengandecode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
diganti denganm ## a ## i ## n
m ## a ## i ## n
diganti denganmain
Jadi secara efektif,
begin()
diganti denganmain()
.sumber