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

时间:2014-01-23 13:42:46

标签: c macros c-preprocessor stringification

是否可以对此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)"

2 个答案:

答案 0 :(得分:4)

是的,这是可能的。请阅读GCC cpp文档中的stringification

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

由于Wojtek Surowka's one

,我更正了我的回答

然后使用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 - 并将其替换为将扩展为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)"。但是,如果您对#defineFOO使用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做你想做的事 - 扩展其论点并在之后添加引号。