va_args - Enfrente de la "cadena" del preprocesador C
gcc macros (2)
Cuando se utiliza el preprocesador C, se puede codificar un argumento macro como este:
#define TO_STRING(x) "a string with " #x
y así cuando se usa, el resultado es el siguiente:
TO_STRING(test)
se expandirá a: "a string with test"
¿Hay alguna forma de hacer lo opuesto? Obtener un literal de cadena como un argumento de entrada y producir un identificador de C? Por ejemplo:
TO_IDENTIFIER("some_identifier")
se expandiría a: some_identifier
Gracias por sus respuestas.
EDITAR: Para aquellos que se preguntan para qué lo necesito:
Quería referirme a los nodos en un gráfico de escena de mi motor 3D mediante identificadores de cadena pero, al mismo tiempo, evitar comparar cadenas en bucles ajustados. Así que pensé que escribiría una herramienta simple que se ejecutará en el paso de compilación previo a la compilación y buscará una cadena predefinida, por ejemplo, ID("something")
. Luego, para cada token, se calcularía CRC32 de la cadena entre paréntesis y se generaría un archivo de encabezado con #defines que contienen esos identificadores numéricos. Por ejemplo, para la cadena "something"
sería:
#define __CRC32ID_something 0x09DA31FB
Entonces, el archivo de encabezado generado sería incluido por cada archivo cpp usando macros ID(x)
. La ID("something")
por supuesto se expandiría a __CRC32ID_something
, por lo que en realidad lo que el compilador vería serían simples identificadores enteros en lugar de cadenas amigables para el hombre. Por supuesto, ahora simplemente me conformaré con ID(something)
pero pensé que usar comillas tendría más sentido: un programador que no sabe cómo funciona la macro de ID
puede pensar que something
sin comillas es un identificador de C cuando en realidad tal identificador no existe en absoluto.
No, no puedes destripar algo.
//unstringify test
enum fruits{apple,pear};
#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;
fruits enum_from_string(wstring ws)
{
fruits f_ret;
IF_WS_COMPARE_SET_ENUM(apple)
IF_WS_COMPARE_SET_ENUM(pear)
return f_ret;
}
void main()
{
fruits f;
f=enum_from_string(L"apple");
f=enum_from_string(L"pear");
}