2008-09-24 10 views
14

Sagen Sie bitteEtwas sowohl eine C-ID als auch eine Zeichenfolge machen?

enum 
{ 
NAME_ONE, 
NAME_TWO, 
NAME_THREE 
}; 

myFunction(NAME_ONE, "NAME_ONE"); 
myFunction(NAME_TWO, "NAME_TWO"); 
myFunction(NAME_THREE, "NAME_THREE"); 

..without sich wiederholen, und ohne Auto-Generierung des Codes, mit C/C++ Makros

Erste Vermutung eines angepassten Liste von Kennungen und Strings generieren möchten:

Sie könnten eine # include-Datei mit

myDefine(NAME_ONE) 
myDefine(NAME_TWO) 
myDefine(NAME_THREE) 

Dann fügen Sie verwenden es zweimal wie:

#define myDefine(a) a, 
enum { 
#include "definitions" 
} 
#undef myDefine 

#define myDefine(a) myFunc(a, "a"); 
#include "definitions" 
#undef myDefine 

aber #define lässt Sie Parameter in einer Zeichenfolge nicht setzen?

Antwort

24

Für Ihre zweite #define, müssen Sie die # Präprozessor Operator verwenden, wie folgt aus:

#define myDefine(a) myFunc(a, #a); 

, dass das Argument in einen String umwandelt.

3

Hier ist ein guter Weg, Namensliste zu erklären:

#define FOR_ALL_FUNCTIONS(F)\ 
    F(NameOne)\ 
    F(NameTwo)\ 
    F(NameThree)\ 

#define DECLARE_FUNCTION(N)\ 
    void N(); 

#define IMPLEMENT_FUNCTION(N)\ 
    void N(){} 

FOR_ALL_FUNCTIONS(DECLARE_FUNCTION); 
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION); 

Auf diese Weise dieser Name-Liste mehrmals wiederverwendet werden kann. Ich habe es für das Prototyping neuer Sprachfunktionen verwendet, obwohl ich sie nie benutzt habe. So waren sie, wenn auch nichts anderes, eine gute Möglichkeit, in eigenen Erfindungen Sackgassen zu finden. Ich frage mich, ob es, weil was sie sagen: "Makros sind schlecht" ... :)

+1

Großartig zu sehen, jemand anderen verwendet den Makronamen auch übergeben. Ich finde diese Technik sehr kraftvoll und nützlich. Schamloser Stecker: http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c#202511 – Suma

Verwandte Themen