Macros de C ++: manipular un parámetro (ejemplo específico)
-
03-07-2019 - |
Pregunta
Necesito reemplazar
GET("any_name")
con
String str_any_name = getFunction("any_name");
La parte difícil es cómo recortar las comillas. ¿Posible? ¿Alguna idea?
Solución
Cómo sobre: ??
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
O, para proteger contra problemas de macros anidados:
#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));
Uso:
SAFE_GET(foo)
Y esto es lo que se compila:
String str_foo = getFunction("foo");
Puntos clave:
- Use ## para combinar parámetros de macro en un solo token (token = > nombre de variable, etc.)
- Y # para alinear un parámetro de macro (muy útil cuando se hace " reflexión " en C / C ++)
- Use un prefijo para sus macros, ya que todas están en el mismo " espacio de nombres " y no quieres colisiones con ningún otro código. (Elegí MLV en función de su nombre de usuario)
- Las macros de envoltura ayudan si anida macros, es decir, llama a MLV_GET desde otra macro con otros parámetros combinados / de cadena (según el comentario a continuación, ¡gracias!).
Otros consejos
Un enfoque no es citar el nombre cuando llama a 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 );
}
En respuesta a su pregunta, no, no puede " quitarse " Las citas en C ++. Pero como lo demuestran otras respuestas, puede " agregarlas. & Quot; Como siempre estarás trabajando con un literal de cadena (¿verdad?), Deberías poder cambiar al nuevo método.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow