Estoy un poco perdido en cuanto al significado de esta declaración preprocesador de C,
-
11-10-2019 - |
Pregunta
Así que, para empezar, aquí está el código, con los nombres reales de los genéricos cambiaron al límite de confusión.
/* Get the list of Hotkey commands */
#define A_COMMANDS_MACRO(a, b, c, d) a = b ,
enum {
#include "commandsFile.def"
} ;
#undef A_COMMANDS_MACRO
Este es un fragmento de un código fuente que he estado buscando una y teniendo en cuenta que se bifurcan como una manera de familiarizarme con las complejidades de la C lenguaje de programación. Por lo tanto, a mi ojo no entrenado, esto parece no hacer nada. Para mi cerebro, definiendo algo y luego inmediatamente undefining parecería que se anulan entre sí.
Obviamente, soy consciente de que estoy equivocado. Pero ¿por qué estoy mal?
Solución
Lo que se ve por lo general se llama X-MACRO. La técnica consiste en la definición de macros a través de #define
, y luego incluyendo un archivo que hace uso de ellos con #include
.
Como un ejemplo muy simple, que podría tener un encabezado (por ejemplo myheader.h ) que declaró 2 funciones en la forma de:
int foo(MYTYPE a, MYTYPE_PTR b);
void bar(MYTYPE a, MYTYPE_PTR b);
Y luego, en el código:
#define MYTYPE int
#define MYTYPE_PTR int*
#include "myheader.h"
#undef MYTYPE
#undef MYTYPE_PTR
Los #undef
s son a veces en el archivo incluido también.
Para obtener más información, echa un vistazo en este enlace de Wikipedia .
Otros consejos
El archivo "commandsFile.def" probablemente usa la "A_COMMANDS_MACRO" en algún lugar macro internamente.
Recuerde que "# include" pastas esencialmente el archivo incluido en el incluido uno, por lo que el #define todavía está en efecto cuando "commandsFile.def" se procesa.
El commandsFile.def
debe contener muchas líneas:
A_COMMANDS_MACRO(A_COMMAND, 10, na, na)
A_COMMANDS_MACRO(OTHER_COMMAND, 23, na, na)
Para que el código crearía una enumeración con los comandos disponibles y sus códigos.
Podría ser útil cuando este archivo .def es utilizado por un programa escrito en otro idioma, por lo que en lugar de la implementación de análisis de texto, utiliza C preprocesador para hacer esto.