c/c++语言开发共享字符串化第一级宏扩展C.

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

    如果为FOOBAR移除两个#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用于FOOBAR你会得到"(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

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐