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).