宏定义。字符串拼接和字符串整形转字符串

摘要:
类似于以下内容:#defineSOFTWARE_VERSION“软件:V1.00”#defineHARDWARE_VERSION”硬件:V1.00“#defineSYSTEM_VERSION然而,经过实际测试,上述代码只能在KEIL/ADS/IAR和其他集成编译环境中使用。如果在Linux下使用gcc编译器,上述代码将产生错误。目前,尚未找到具体原因。经过大量的麻烦后,发现在gcc环境中,如果您想连接多个字符串,可以使用空格直接连接它们。
#include <stdio.h>

#define A  ".5.6"
#define SAMPLE_RATE_CONFIG 5

#define STR1(R)  #R
#define STR3(R)  STR1(R) A

#define STR4    STR3(SAMPLE_RATE_CONFIG)

int main()
{

      printf("same rate config = %s
", STR4 );
      return 0;
}

结果如下

预编译之后如下 
int main()
{

      printf("same rate config = %s
", "5" ".5.6" );
      return 0;
}

结果如下:
same rate config = 5.5.6

适用场景举例

流媒体处理系统中,采样率是个很重要的参数,很多地方都要用,如果用来分配内存,则

#define SAMPLE_RATE 16000

如果用来配置第三方库,则
#define SAMPLE_RATE "16000"

这样每次改采样率都要改两处地方,容易遗漏


网上搜到第一篇文章,匆忙试了试,并未达到我想要的效果,然后在GNU的官网找到了第二篇文章,看懂了,原来第一篇文章的技巧(也是翻译第二篇文章的)仅适用于宏函数的场景

还好天无绝人之路,第二篇文章末尾3段,讲述了实现我想要效果的方法,就是二级stringfication

#include <stdio.h>

#define SAMPLE_RATE 16000
#define STR1(R) #R
#define STR2(R) STR1(R)

int main()
{
printf("sample rate = " STR2(SAMPLE_RATE) " ");
return 0;
}

运行输出
sample rate = 16000

注意:
二级stringfication会将宏定义原样输出,即,如果16000加上括弧(有经验的程序员都懂),则STR2输出的也是带括弧的字符串,这通常不是你想要的

可以这样绕过:

给SAMPLE_RATE定义一个别名,并给别名加上括弧,在需要整型时用别名,在需要字符串时用原名

#include <stdio.h>

#define SAMPLE_RATE_CONFIG 16000
#define SAMPLE_RATE (SAMPLE_RATE_CONFIG)
#define STR1(R) #R
#define STR2(R) STR1(R)

int main()
{
printf("sample rate = %d ", SAMPLE_RATE);
printf("sample rate config = %s ", STR2(SAMPLE_RATE_CONFIG));
return 0;
}

运行输出
sample rate = 16000
sample rate config = 16000



拼接

最近在编写一个项目的代码时,需要在宏定义中连接多个字符串,具体来说就是,先定义一个软件版本号,然后再定义一个硬件版本号, 然后再将他们拼合起来生成一个综合版本号。这些动作我都希望在宏定义中直接完成,提供代码的可读性和可移植性。

类似于下面这样的:

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION ????

但是,经过实际测试,以上的代码,只能用于KEIL/ADS/IAR等集成编译环境中。如果是在linux下,使用gcc编译器的话,上述代码就会出错,目前尚未查出具体原因。经过一番折腾后,发现gcc环境下,如果要连接多个字符串,直接使用空格连接就行了。所以将其改为如下语句就可以了:

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION SOFTWARE_VERSION HARDWARE_VERSION

keil 

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION SOFTWARE_VERSION##" "##HARDWARE_VERSION

免责声明:文章转载自《宏定义。字符串拼接和字符串整形转字符串》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】查看java类是从哪个包加载EBS System Profile 常用清单下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux操作系统学习_操作系统是如何工作的

Linux操作系统学习_操作系统是如何工作的实验五:Linux操作系统是如何工作的? 学号:SA1****369 操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制       首先要整明白的一个问题是什么是存储程序计算机?其实存储程序计算机正是冯.诺依曼最初提出的计算机体系模型,现在我们一提到冯.诺依曼体系结构首先会想到的应该是包含输...

STM32 F4xx Fault 异常错误定位指南

STM32 F407 采用 Cortex-M4 的内核,该内核的 Fault 异常可以捕获非法的内存访问和非法的编程行为。Fault异常能够检测到以下几类非法行为: 总线 Fault: 在取址、数据读/写、取中断变量、进入/退出中断时寄存器堆栈操作(入栈/出栈)时检测到内存访问错误。 存储器管理 Fault: 检测到内存访问违反了内存保护单元(MPU,...

Zynq 7020笔记之 GPIO MIO 和EMIO的学习

1 参考 Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO 2 理论指示 在PS侧,有PS自己的IO pin,称为MIO,共有54个(编号0-53)。如果PS侧IO不够使用,则可以通过扩展的方式来使用PL侧的IO。扩展方式有两中:EMIO和GPIO。 EMIO 方式可以将PL侧IO...

XML文件的解析--libxml库函数解释

[c语言]XML文件的解析--libxml库函数解释 2009-09-02 13:12 XML文件的解析--libxml库函数解释 libxml(一)                                     摘要 Libxml是一个有免费许可的用于处理XML、可以轻松跨越多个平台的C语言库。这个指南提供它的基本函数的例子。绪论 Lib...

VS2019配置MKL教程(Windows)

下载链接:https://software.intel.com/en-us/mkl 文件下载 官网注册后,选择MKL下载下来,安装到指定目录就行,不在多说。 配置文件 首先创建一个Windows桌面项目,再添加一个CPP源文件。 打开项目属性页--配置属性,会多出Intel Performance...这一项,看下图配置 在打开VC++目录,进行配置...

STM32CubeIDE使用ITM调试

以前用Keil MDK总喜欢用一个串口,使用printf函数往串口助手上打印一些提示信息。发现使用ITM比使用串口调试好使一点,但是前提是,必须要用调试器,J-Link或者ST-Link,ST-Link还必须要有SWO这根线,也就是一般开发板上带的4线的SWD接口是不行的。下面记录一下我的配置过程。 打开IDE新建STM32工程,file-->new...