Стриптизировать макроразложение первого уровня C

Можно ли выровнять этот макрос 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 делает то, что вы хотите – расширяет свой аргумент и добавляет цитаты после.