parse array c macros c-preprocessor stringification

array - string to json javascript



Expansión de macros de primer nivel de Stringify C (2)

Si tienes esas dos definiciones

#define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s)

MY_STRINGIFY hace lo que desea: amplía su argumento y agrega comillas después.

¿Es posible codificar esta macro C?

#define GPIO_INT_PIN (GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)

usando algo como

MY_STRINGFY(GPIO_INT_PIN)

Llegar

"(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)" ?


Sí, es posible. Lea sobre la cadena en la documentación de GCC cpp .

#define STRINGIFY(It) #It #define MY_STRINGIFY(It) STRINGIFY(It)

Corregí mi respuesta gracias a la de Wojtek Surowka

luego use MY_STRINGIFY(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5) que funcionaría mucho mejor si utiliza una enum para definir las constantes, por ejemplo

enum Gpio_stuff_en { GPIO_PORT_D=5, GPIO_PIN_IRQ_RISING=17, GPIO_PIN5=23 };

Por supuesto, eso no funcionará como lo desea si necesita que GPIO_PORT_D sea ​​una macro, por ejemplo, porque se expande a alguna expresión que no sea de constante literal (como una variable, o un acceso a un campo de alguna estructura global, etc. ...)

Como un contraejemplo:

#define FOO 1 #define BAR 2 #define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s) MY_STRINGIFY(FOO|BAR)

se expande a "1|2" no a "FOO|BAR" , si elimina los dos #define -s para FOO y para BAR y los reemplaza con

enum { FOO=1, BAR=2 };

realmente obtienes la expansión "FOO|BAR" como quieras. Verifica con gcc -C -E ...

También:

enum {FOO=1, BAR=2}; #define FOOORBAR (FOO|BAR) #define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s) MY_STRINGIFY(FOOORBAR)

se expande como "(FOO|BAR)" . Pero si usa #define para FOO y para BAR obtiene la expansión "(1|2)" .

Tal vez podría agregar en su propio encabezado, después de incluir el encabezado externo que define GPIO_PORT_D etc ... como constantes literales, algo así como:

enum {en_GPIO_PORT_D= GPIO_PORT_D, en_GPIO_PIN_IRQ_RISING= GPIO_PIN_IRQ_RISING, en_GPIO_PIN5= GPIO_PIN5}; #undef GPIO_PORT_D #undef GPIO_PIN_IRQ_RISING #undef GPIO_PIN5 #define GPIO_PORT_D en_GPIO_PORT_D #define GPIO_PIN_IRQ_RISING en_GPIO_PIN_IRQ_RISING #define GPIO_PIN5 en_GPIO_PIN5

y luego obtendrás constantes codificadas más legibles (pero no exactamente con lo que sueñas).