Macro C ++: manipolazione di un parametro (esempio specifico)
-
03-07-2019 - |
Domanda
Devo sostituire
GET("any_name")
con
String str_any_name = getFunction("any_name");
La parte difficile è come tagliare le virgolette. Possibile? Qualche idea?
Soluzione
Che ne dici di:
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
Oppure, per proteggersi dai problemi di macro nidificati:
#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));
Utilizzo:
SAFE_GET(foo)
E questo è ciò che viene compilato:
String str_foo = getFunction("foo");
Punti chiave:
- Usa ## per combinare i parametri macro in un singolo token (token = > nome variabile, ecc.)
- E # per stringere un parametro macro (molto utile quando si fa "riflesso" in C / C ++)
- Utilizza un prefisso per le tue macro, poiché sono tutte nello stesso "spazio dei nomi" e non vuoi collisioni con nessun altro codice. (Ho scelto MLV in base al tuo nome utente)
- Le macro wrapper aiutano se annidate le macro, ovvero chiamate MLV_GET da un'altra macro con altri parametri uniti / stringenti (come da commento sotto, grazie!).
Altri suggerimenti
Un approccio non è quello di citare il nome quando si chiama la macro:
#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 risposta alla tua domanda, no, non puoi " rimuovere " le virgolette in C ++. Ma come dimostrano altre risposte, puoi " aggiungerle su " Dato che lavorerai sempre con una stringa letterale (giusto?), Dovresti essere in grado di passare al nuovo metodo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow