是否可以对此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)
如果为FOO
和BAR
移除两个#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
用于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
然后你将获得更多可读的字符串化常量(但不完全是你梦寐以求的)。
如果你有这两个定义
#define STRINGIFY(s) #s #define MY_STRINGIFY(s) STRINGIFY(s)
MY_STRINGIFY做你想要的 – 扩展其论点并在之后添加引号。
以上就是c/c++开发分享字符串化第一级宏扩展C.相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545658.html