Frage

Ich brauche zu ersetzen

GET("any_name")

mit

String str_any_name = getFunction("any_name");

Der harte Teil ist, wie die Anführungszeichen zu trimmen. Möglich? Irgendwelche Ideen?

War es hilfreich?

Lösung

Wie wäre:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

Oder, um sicheren Schutz gegen verschachtelte Makro Probleme:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

Verbrauch:

SAFE_GET(foo)

Und das ist, was kompiliert wird:

String str_foo = getFunction("foo");

Kernpunkte:

  • Mit ## kombinieren Makroparameter in ein einziges Token (Token => Variablennamen, usw.)
  • und # einen Makro-Parameter auf stringify (sehr nützlich, wenn "Reflexion" in C / C ++ zu tun)
  • einen Präfix für Ihre Makros verwenden, da sie alle in dem gleichen „Namensraum“ sind und Sie nicht möchten, dass Kollisionen mit einem anderen Code. (Ich habe mich für MLV basierend auf Ihren Benutzernamen)
  • Die Wrapper-Makros helfen, wenn Sie nisten Makros, das heißt MLV_GET Anruf von einem anderen Makro mit anderen fusionieren / Stringized Parametern (gemäß dem Kommentar unten, danke!).

Andere Tipps

Ein Ansatz ist es nicht, den Namen zu zitieren, wenn Sie die Makro aufrufen:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

int main() {
    GET( foobar );
}

In Antwort auf Ihre Frage, nein, man kann nicht „abzustreifen“ die Anführungszeichen in C ++. Aber wie andere Antworten zeigen, können Sie „fügen Sie sie auf.“ Da Sie immer wörtlichen ohnehin mit einem String arbeiten (oder?), Sollten Sie in der Lage sein, auf die neue Methode zu wechseln.

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