2016-05-08 22 views
5

Betrachten Sie das folgende Makro:Warum benötigt der Indirektionsoperator ist

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

wo SLB_ALGORITHM ist eine definierte Pre-Prozessor-Symbol. Wenn ich einfach CAT anstelle von CMB verwende, wird SLB_ALGORITHM nicht erweitert. Warum ist das der Fall und wie genau hilft die Umleitung?

Antwort

2

this answer zu zitieren:

Wenn Sie einen Makro Ersatz haben, wird der Prä-Prozessor erweitert nur die Makros rekursiv, wenn weder die Zeichenfolge Operator # noch der Token-Einfügen Operator ## auf mich angewandt werden.

Der Präprozessor erweitert also ein bestimmtes Makro nicht, wenn ## auf es angewendet wird. Aus diesem Grund ist es in der CMB(A, B) Ebene, aber nicht bei direkter Verwendung CAT(X, Y) exapendiert.

+0

Ich verstehe immer noch nicht, wie das genau funktioniert. Wenn 'CAT' direkt verwendet wird, sollte die erste Substitution' CAT (Logging, SLB_ALGORITHM) 'erzeugen, die nicht' ## 'hat. – AlwaysLearning

+0

Wenn' CAT (Logging, SLB_ALGORITHM) 'direkt benutzt wird' SLB_ALGORITHM' wird nur einmal an ein Makro übergeben, so dass es in 'Logging ## SLB_ALGORITHM' übersetzt wird, das' ## 'enthält. – Tomer

5

## eine Zeichenfolge Verkettungs ist, also wenn Sie CAT(Logging, SLB_ALGORITHM) von SLB_LOGGING_ALGORITHM Makro aufrufen, diese SLB_ALGORITHM in Verkettung von String Logging mit String führen wird, das heißt: LoggingSLB_ALGORITHM, die nicht wahrscheinlich ist, was Sie wollen.

Wenn CMB(Logging, SLB_ALGORITHM) von SLB_LOGGING_ALGORITHM Makro aufrufen, zuerst stattdessen Präprozessor erweitert Logging und SLB_ALGORITHM (Aufruf zum CMB()) dann den erweiterten Strings verketten (Aufruf zum CAT()).

+0

Was genau bewirkt der Aufruf von 'CMB', dass' SLB_ALGORITHM' erweitert wird? (mehr als im Aufruf zu "CAT") – AlwaysLearning

Verwandte Themen