6 Stimmen

C++ Makro - String in Großbuchstaben umwandeln

Ich benutze Präprozessor-Makros, um einige wiederkehrende Variablen zu deklarieren, speziell:

QuitCallbackType quitCallback;
LossCallbackType lossCallback;
PauseCallbackType pauseCallback;
KeyCallbackType keyCallback;
MouseCallbackType mouseCallback;

Ich möchte ein Präprozessor-Makro verwenden, um dies zu tun, a la

CREATE_CALLBACK_STORAGE(quit)
CREATE_CALLBACK_STORAGE(loss)
CREATE_CALLBACK_STORAGE(pause)
CREATE_CALLBACK_STORAGE(key)
CREATE_CALLBACK_STORAGE(mouse)

wo es im Wesentlichen so aussehen würde:

#define CREATE_CALLBACK_STORAGE(x) capitalize(x)##CallbackType x##CallBack;

Gibt es eine Möglichkeit, dies zu tun, damit ich nicht beide die großgeschriebene UND die Kleinbuchstaben-Versionen jedes Namens übergeben muss?

Ich weiß, dass es nicht viel weniger Tippen ist, Makros zu verwenden, aber das Problem selbst begann mich zu fesseln.

5voto

Mark Ransom Punkte 283960

Der Makropräprozessor hat nicht die Fähigkeit, Teilzeichenfolgen zu nehmen oder einen Buchstaben zu großzuschreiben. Tut mir leid.

Wenn Sie Ihr Benennungsschema ändern könnten, könnten Sie möglicherweise mehr Erfolg haben. Zum Beispiel:

QuitCallbackType _QuitCallback;

Bearbeiten: Mir wurde geraten, keine führenden Unterstriche zu verwenden, aber die Idee gilt immer noch:

QuitCallbackType callbackQuit;

2voto

Alexander Rafferty Punkte 6030

Ich denke, du solltest die Idee von Makros ganz verwerfen. Eine bessere Lösung wäre, eine einfache Datenstruktur zu erstellen, wie zum Beispiel:

struct CallBacks {
  QuitCallbackType quit;
  LossCallbackType loss;
  PauseCallbackType pause;
  KeyCallbackType key;
  MouseCallbackType mouse;
};

Und stattdessen dies verwenden:

CallBacks callback;

Du kannst nur die Member verwenden, die du möchtest:

callback.quit = GetCallback(...);
someFunc(callback.quit);
// ect..

Es macht meiner Meinung nach auch die Variablennamen etwas klarer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X