c c-preprocessor preprocessor-directive

¿Haciendo algo tanto un identificador de C como una cadena?



c-preprocessor preprocessor-directive (2)

Aquí hay una buena manera de declarar la lista de nombres:

#define FOR_ALL_FUNCTIONS(F)/ F(NameOne)/ F(NameTwo)/ F(NameThree)/ #define DECLARE_FUNCTION(N)/ void N(); #define IMPLEMENT_FUNCTION(N)/ void N(){} FOR_ALL_FUNCTIONS(DECLARE_FUNCTION); FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);

De esta forma, esta lista de nombres puede reutilizarse varias veces. Lo he usado para crear prototipos de nuevas características del lenguaje, aunque nunca terminé usándolos. Entonces, si nada más, eran una gran manera de encontrar callejones sin salida en los propios inventos. Me pregunto si es porque lo que dicen: "las macros son malas" ... :)

Supongamos que desea generar una lista coincidente de identificadores y cadenas

enum { NAME_ONE, NAME_TWO, NAME_THREE }; myFunction(NAME_ONE, "NAME_ONE"); myFunction(NAME_TWO, "NAME_TWO"); myFunction(NAME_THREE, "NAME_THREE");

... sin repetirse, y sin autogenerar el código, usando macros C / C ++

Estimación inicial:

Puede agregar un archivo #include que contenga

myDefine(NAME_ONE) myDefine(NAME_TWO) myDefine(NAME_THREE)

Entonces úsalo dos veces como:

#define myDefine(a) a, enum { #include "definitions" } #undef myDefine #define myDefine(a) myFunc(a, "a"); #include "definitions" #undef myDefine

pero #define no te permite poner parámetros dentro de una cadena?


Para su segundo #define, necesita usar el operador # preprocesador, así:

#define myDefine(a) myFunc(a, #a);

Eso convierte el argumento en una cadena.