Можно ли выровнять этот макрос C:
#define GPIO_INT_PIN (GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)
используя что-то вроде
MY_STRINGFY(GPIO_INT_PIN)
получить
"(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)"
?
Да, это возможно. Читайте о строчении в документации cpp
.
#define STRINGIFY(It) #It #define MY_STRINGIFY(It) STRINGIFY(It)
Я исправился с ответом благодаря тому, что Войтек Суровка
затем используйте MY_STRINGIFY(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)
который будет работать намного лучше, если вы используете enum
для определения констант, например
enum Gpio_stuff_en { GPIO_PORT_D=5, GPIO_PIN_IRQ_RISING=17, GPIO_PIN5=23 };
Конечно, это не будет работать, если вы хотите, чтобы GPIO_PORT_D
был макросом, .eg, потому что он расширяется до некоторого выражения без констант-литерального выражения (например, переменной или доступа к полю какой-либо глобальной структуры и т. Д. …)
В качестве контр-примера:
#define FOO 1 #define BAR 2 #define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s) MY_STRINGIFY(FOO|BAR)
расширяется до "1|2"
не "FOO|BAR"
, если вы удалите два #define
-s для FOO
и для BAR
и замените их на
enum { FOO=1, BAR=2 };
вы действительно получите расширение "FOO|BAR"
по вашему желанию. Проверьте с помощью gcc -C -E
…
Также:
enum {FOO=1, BAR=2}; #define FOOORBAR (FOO|BAR) #define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s) MY_STRINGIFY(FOOORBAR)
расширяется как "(FOO|BAR)"
. Но если вы используете #define
для FOO
и для BAR
вы получаете расширение "(1|2)"
.
Возможно, вы могли бы добавить свой собственный заголовок, включив в него внешний заголовок, определяющий GPIO_PORT_D
т. Д. … как литерал-константы, например:
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
и тогда вы получите более читаемые строчные константы (но не совсем то, о чем вы мечтаете).
Если у вас есть два определения
#define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s)
MY_STRINGIFY делает то, что вы хотите – расширяет свой аргумент и добавляет цитаты после.