2009-07-13 7 views
5

Ich war auf der Suche durch das DXUTCore Projekt, das mit dem DirectX März 2009 SDK kommt, und bemerkte, dass statt normalen Accessormethoden zu machen, sie Makros die allgemeinen Accessoren, ähnlich wie die folgenden zu erstellen:Was ist der Zweck des ## - Operators in C++ und wie heißt er?

#define GET_ACCESSOR(x, y) inline x Get##y() { DXUTLock l; return m_state.m_##y;}; 
... 

GET_ACCESSOR(WCHAR*, WindowTitle); 

Es scheint, dass der Operator ## nur den Text aus dem zweiten Argument in das Makro einfügt, um eine Funktion zu erstellen, die auf einer Variablen mit diesem Text operiert. Ist das etwas, das in C++ Standard ist (d. H. Nicht Microsoft-spezifisch)? Wird seine Verwendung als gute Praxis angesehen? Und wie heißt dieser Operator?

+1

Brennen Sie es in einem Feuer, vertrau mir. – clemahieu

Antwort

5

Es handelt sich um einen Vorverarbeitungsoperator, der linke und rechte Operanden verkettet (ohne Leerzeichen einzufügen). Ich denke nicht, dass es Microsoft spezifisch ist.

+5

Es ist definitiv nicht. C einschließlich seiner Präprozessor ist älter als MS :) – Joey

+0

Ich vermutete, aber es ist gefährlich, Dinge auf SO zu posten, die Sie nicht 100% sicher sind und die C-Spezifikation nicht gelesen haben, konnte ich nicht sicher wissen. ;) –

+0

Allerdings ist der ## Präprozessor-Operator nicht original C, und obwohl es alt ist, glaube ich nicht, dass es älter als Microsoft ist. –

1

es ist die Verkettung für Makroargumente heißt

GET_ACCESSOR (int, Age); 

wird

inline int GetAge() { DXUTLock l; return m_state.m_Age;}; 
3

aufgewendet werden Dies ist nicht der Standard-C++, ist es Standard-C this Wikipedia article Check out.

Und ist es eine gute Praxis? Im Allgemeinen hasse ich Pre-Prozessor-Makros und denke, sie sind so schlecht wie (wenn nicht schlimmer als) Goto.

Edit: Anscheinend werde ich missverstanden von dem, was ich meinte "Dies ist nicht Standard C++, es ist Standard C". Viele Leute lesen den ersten Satz und lesen den zweiten nicht. Meine Absicht ist es, darauf hinzuweisen, dass Makros von C++ von C.

+1

Dies ist Standard-C++, siehe meine Antwort unten. – GManNickG

+1

Ich denke, Randolphos Punkt ist, während C++ es im Standard haben kann, es ist vor C++, dh es ist auch ein C-Feature (Wetterstandard C oder nicht). –

+0

Ah, ich habe mich nur zu "Dies ist nicht Standard C++", was nicht stimmt. – GManNickG

2

geerbt wurden als Mehrdad sagte, verkettet sie die Operanden, wie:

#define MyMacro(A,B) A ## B 
MyMacro(XYZ, 123) // Equivalent to XYZ123 

Beachten Sie, dass MISRA C legt nahe, dass dieser Operand (und die # ' stringify 'operand) sollte aufgrund der kompilerabhängigen Reihenfolge der Berechnung nicht verwendet werden.

2

Es ist ein Token-Pasting-Operator, der von Standard C++ erlaubt wird (siehe 16.3.3 für Details). Wie für gute Praxis: Makro verwenden ist keine gute Praxis IMHO (in C++).

6

Dies ist auch Standard C++, im Gegensatz zu was Raldolpho angegeben.

sind die relevanten Informationen:

16.3.3 Der ## Operator [cpp.concat]

1 A ## Vorverarbeitung Token wird nicht am Anfang auftreten oder am Ende von eine Ersatzliste für jedes Formular der Makrodefinition.

2 Wenn in der Ersatzliste, ein Parameter unmittelbar ein ## Vorverarbeitung Token vorausgehen oder folgen, wird der Parameter durch den entsprechenden Argument der Vorverarbeitung Token Sequenz ersetzt.

3 Für beide objektähnlichen und funktionsähnlichen Makro Invokationen, vor der Ersatzliste ist für mehr Makronamen nachuntersucht ersetzen, jede Instanz einer ## Vorverarbeitung Token in der Ersatz Liste (nicht aus Ein Argument) wird gelöscht und das vorangehende Vorverarbeitungstoken wird mit dem folgenden Vorverarbeitungstoken verkettet. Wenn das Ergebnis kein gültiges Vorverarbeitungstoken ist, ist das Verhalten nicht definiert. Das resultierende Token ist für das weitere Makro Ersatz verfügbar. Die Reihenfolge der Auswertung von ## Operatoren ist nicht spezifiziert.

Verwandte Themen