字符串化第一级宏扩展C.

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)"

Bas*_*tch 6

对的,这是可能的。阅读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)". 但是如果你使用#defineforFOO和 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)

然后你会得到更多可读的字符串化常量(但不是你梦寐以求的)。