2014-04-09 12 views
51

La riga di cui sopra è presa da Unreal 4, e so che potrei chiederlo nei forum irreali, ma penso che questa sia una domanda generale C++ che merita di essere posta qui.Cosa fa ## (double hash) in una direttiva preprocessore?

Capisco che la prima riga definisca una macro, tuttavia non sono esperto in shenanigans del preprocessore in C++ e quindi sono perso laggiù. La logica mi dice che il backslash significa che la dichiarazione continua sulla riga successiva.

FThreadSafeStaticStat sembra un po 'come un modello, ma non c'è #' s sta succedendo in là e una sintassi non ho mai visto prima in C++

Qualcuno potrebbe dirmi cosa significa questo? Capisco che potresti non avere accesso a Unreal 4, ma è solo la sintassi che non capisco.

+4

È possibile leggere su ## operator [su cppreference] (http://en.cppreference.com/w/cpp/preprocessor/replace#.23_and_.23.23_operators), tra le altre cose – Cubbi

+0

'##' is/potrebbe essere chiamato l'operatore di concatenazione. – dyp

+0

Oh, è fantastico! Spiega piuttosto molto, grazie. Ma perché viene utilizzata la parola chiave struct? La linea assomiglia più ad una definizione di variabile – Constan7ine

risposta

90

## è l'operatore di preprocessore per la concatenazione.

Quindi, se si utilizza

DEFINE_STAT(foo)

in qualsiasi parte del codice, viene sostituito con

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

prima che il codice viene compilato.

Ecco un altro esempio dal mio a blog post per spiegarlo ulteriormente.

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

Questo programma dovrebbe compilare ed eseguire con successo, e produrre il seguente output:

Stumped? 

Quando il preprocessore lavora su questo codice,

  • begin() è sostituito con decode(a,n,i,m,a,t,e)()
  • decode(a,n,i,m,a,t,e)() sostituito con m ## a ## i ## n()
  • m ## a ## i ## n() è sostituito con main()

Così efficace, begin() viene sostituito con main().

+37

Sneaky. Forse * troppo * di nascosto per mostrare di fronte ai neofiti ... – vonbrand

Problemi correlati