## (çift hash) bir önişlemci yönergesinde ne yapar?


91
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

Yukarıdaki satır Unreal 4'ten alınmıştır ve bunu gerçek dışı forumlarda sorabileceğimi biliyorum, ancak bence bu, burada sorulmasını garanti eden genel bir C ++ sorusu.

İlk satırın bir makroyu tanımladığını anlıyorum, ancak C ++ 'da önişlemci kuruntuları konusunda çok bilgili değilim ve bu yüzden orada kayboldum. Mantık bana ters eğik çizginin beyanın bir sonraki satırda devam ettiği anlamına geldiğini söylüyor.

FThreadSafeStaticStat biraz şablona benziyor, ancak orada # var ve C ++ 'da daha önce hiç görmediğim bir sözdizimi var

Birisi bana bunun ne anlama geldiğini söyleyebilir mi? Unreal 4'e erişiminizin olmayabileceğini anlıyorum, ancak bu sadece anlamadığım sözdizimi.


6
## operatörü hakkında diğer şeylerin yanı sıra cppreference'de okuyabilirsiniz
Cubbi

1
##bitiştirme operatörü olarak adlandırılabilir.
2014

1
Oh, bu oldukça havalı! Oldukça açıklıyor, teşekkürler. Ama struct anahtar sözcüğü neden kullanılıyor? Çizgi daha çok değişken tanımına benziyor
DavidColson

1
structBir tanıtır ayrıntılı tipi belirtici kadarıyla söyleyebilirim.
2014

2
Resmi adı "jeton yapıştırma operatörü" dür çünkü iki ön işleme jetonunu başka bir tane üretmek için birleştirir. Bunun yalnızca sonucun geçerli bir ön işleme belirteci olması durumunda geçerli olduğunu unutmayın, örneğin yapmak + ## 3için yapamazsınız +3. (Ama + 3operatör olmadan elbette yapabilirsiniz )
MM

Yanıtlar:


175

## bitiştirme için ön işlemci operatörüdür.

Yani eğer kullanırsan

DEFINE_STAT(foo)

kodun herhangi bir yerinde, değiştirilir

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

kodunuz derlenmeden önce.

İşte bunu daha ayrıntılı açıklamak için bir blog yazımdan başka bir örnek .

#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");
}

Bu program başarıyla derlenir ve yürütülür ve aşağıdaki çıktıyı üretir:

Stumped?

Önişlemci bu kodda çağrıldığında,

  • begin ile değiştirilir decode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) ile değiştirilir m ## a ## i ## n
  • m ## a ## i ## n ile değiştirilir main

Böylece etkin bir şekilde begin()yerini alır main().


8
## davranışını öğrenmek için çok düşünmeyi beklemiyordum ama sanırım şimdi bunu asla unutmayacağım? Çok teşekkürler.
NicoBerrogorry

2
Takip etmem bir saniyemi aldı, ama bu soruya harika bir cevaptı. Teşekkürler.
2019
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.