字符串化第一级宏扩展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)"

对的,这是可能的。 阅读GCC cpp文档中的字符串化 。

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

由于Wojtek Surowka的一个,我纠正了我的回答

然后使用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作为一个宏,那将无法工作,例如GPIO_PORT_D ,因为它扩展为一些非常量文字表达式(如变量,或访问某些全局结构的字段等)。 …)

作为反例:

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

如果为FOOBAR移除两个#define -s并将其替换为"FOO|BAR" ,则将其扩展为"1|2"而不是"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用于FOOBAR你会得到"(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做你想要的 – 扩展其论点并在之后添加引号。