Frage

Sagen Sie bitte eine abgestimmte Liste von Kennungen und Strings generieren möchten

enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};

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

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

Erste Vermutung:

Sie können eine # include-Datei mit

hinzufügen
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)

dann verwenden, zweimal wie:

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

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

aber #define nicht lassen Sie Parameter setzen innerhalb eines Strings?

War es hilfreich?

Lösung

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

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

Das wandelt das Argument in einen String.

Andere Tipps

Hier ist ein guter Weg, Namen-Liste zu deklarieren:

#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 neue Sprachfunktionen verwendet, obwohl sie nie mit endete. Also, wenn nichts anderes, waren sie eine gute Möglichkeit, Sackgassen in eigenen Erfindungen zu finden. Ich frage mich, ob es denn das, was sie sagen: „Makros sind schlecht“ ...:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top