Hee*_*ryu 8 c macros stringification c-preprocessor
是否可以对此C宏进行字符串化:
#define GPIO_INT_PIN (GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)
Run Code Online (Sandbox Code Playgroud)
使用类似的东西
MY_STRINGFY(GPIO_INT_PIN)
Run Code Online (Sandbox Code Playgroud)
要得到
"(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)"
?
对的,这是可能的。阅读GCC文档中的字符串化cpp
。
#define STRINGIFY(It) #It
#define MY_STRINGIFY(It) STRINGIFY(It)
Run Code Online (Sandbox Code Playgroud)
感谢Wojtek Surowka 的回答,我更正了我的回答
MY_STRINGIFY(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)
如果你使用 anenum
来定义常量,那么使用哪个会更好,例如
enum Gpio_stuff_en {
GPIO_PORT_D=5,
GPIO_PIN_IRQ_RISING=17,
GPIO_PIN5=23
};
Run Code Online (Sandbox Code Playgroud)
当然,如果您需要GPIO_PORT_D
成为一个宏,那将无法如您所愿,例如,因为它扩展为一些非常量的文字表达式(如变量,或对某些全局结构的字段的访问等。 ..)
举个反例:
#define FOO 1
#define BAR 2
#define STRINGIFY(s) #s
#define MY_STRINGIFY(s) STRINGIFY(s)
MY_STRINGIFY(FOO|BAR)
Run Code Online (Sandbox Code Playgroud)
扩展为"1|2"
not to "FOO|BAR"
,如果您删除两个#define
-s forFOO
和 forBAR
并将它们替换为
enum {
FOO=1,
BAR=2 };
Run Code Online (Sandbox Code Playgroud)
你真的得到了"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)
Run Code Online (Sandbox Code Playgroud)
扩展为"(FOO|BAR)"
. 但是如果你使用#define
forFOO
和 forBAR
你会得到"(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
Run Code Online (Sandbox Code Playgroud)
然后你会得到更多可读的字符串化常量(但不是你梦寐以求的)。