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?

¿Fue útil?

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
scroll top