是否可以对此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)"
?
答案 0 :(得分:4)
是的,这是可能的。请阅读GCC cpp
文档中的stringification。
#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
作为宏,那么这将无法正常工作,.e.g。因为它扩展为一些非常量文字表达式(如变量,或访问某些全局结构的字段等等)。
作为反例:
#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
- 并将其替换为1,则将扩展为FOO
而不是BAR
p>
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
然后你将获得更多可读的字符串化常量(但不完全是你梦寐以求的)。
答案 1 :(得分:3)
如果你有这两个定义
#define STRINGIFY(s) #s
#define MY_STRINGIFY(s) STRINGIFY(s)
MY_STRINGIFY做你想做的事 - 扩展其论点并在之后添加引号。