2016-05-08 38 views
5

Si consideri la seguente macro:Perché il riferimento indiretto necessario

#define CAT(X, Y) X ## Y 
#define CMB(A, B) CAT(A, B) 
#define SLB_LOGGING_ALGORITHM CMB(Logging, SLB_ALGORITHM) 

dove SLB_ALGORITHM è un simbolo pre-processore definito.

Se utilizzo solo CAT direttamente anziché CMB, SLB_ALGORITHM non viene espanso. Perché questo è il caso e in che modo esattamente l'induzione indiretta aiuta?

risposta

2

Per citare this answer:

Quando si dispone di una sostituzione macro, il preprocessore si espanderà solo le macro in modo ricorsivo se né l'operatore stringizing # né l'operatore token-incolla ## vengono applicate ad esso.

Quindi il preprocessore non espande una data macro quando si applica a ##. Questo è il motivo per cui è stato perfezionato nel livello CMB(A, B) ma non quando si utilizza direttamente lo CAT(X, Y).

+0

Ancora non capisco come funziona esattamente. Quando 'CAT' è usato direttamente, la prima sostituzione dovrebbe produrre' CAT (Logging, SLB_ALGORITHM) ', che non ha' ## 'o ... – AlwaysLearning

+0

Quando' CAT (Logging, SLB_ALGORITHM) 'viene usato direttamente' SLB_ALGORITHM' viene passato solo una volta a una macro, quindi si traduce in 'Logging ## SLB_ALGORITHM' che contiene' ## '. – Tomer

5

## è una concatenazione delle stringhe, quindi se si chiama da CAT(Logging, SLB_ALGORITHM)SLB_LOGGING_ALGORITHM macro, questo si tradurrà in concatenazione di stringhe Logging con la stringa SLB_ALGORITHM, vale a dire: LoggingSLB_ALGORITHM che probabilmente non quello che volete.

quando chiamate CMB(Logging, SLB_ALGORITHM) da SLB_LOGGING_ALGORITHM macro, invece, preprocessore espande prima Logging e SLB_ALGORITHM (chiamata a CMB()) poi concatenare le stringhe espanse (chiamata a CAT()).

+0

Cosa esattamente nella chiamata a 'CMB' causa l'espansione di' SLB_ALGORITHM'? (più che nella chiamata a 'CAT') – AlwaysLearning