将C语言宏定义转换成字符串!

摘自:https://blog.csdn.net/happen23/article/details/50602667

2016年01月28日 19:15:47 六个九十度 阅读数:10185
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happen23/article/details/50602667

适用场景举例

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

#define SAMPLE_RATE 16000

如果用来配置第三方库,则

#define SAMPLE_RATE "16000"

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

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

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

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    #define SAMPLE_RATE 16000
  4.  
    #define STR1(R) #R
  5.  
    #define STR2(R) STR1(R)
  6.  
     
  7.  
    int main()
  8.  
    {
  9.  
    printf("sample rate = " STR2(SAMPLE_RATE) "\n");
  10.  
    return 0;
  11.  
    }

运行输出

sample rate = 16000

注意:

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

可以这样绕过:

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

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    #define SAMPLE_RATE_CONFIG 16000
  4.  
    #define SAMPLE_RATE (SAMPLE_RATE_CONFIG)
  5.  
    #define STR1(R) #R
  6.  
    #define STR2(R) STR1(R)
  7.  
     
  8.  
    int main()
  9.  
    {
  10.  
    printf("sample rate = %d\n", SAMPLE_RATE);
  11.  
    printf("sample rate config = %s\n", STR2(SAMPLE_RATE_CONFIG));
  12.  
    return 0;
  13.  
    }

运行输出

sample rate = 16000
sample rate config = 16000

将C语言宏定义数值转换成字符串!的更多相关文章

  1. 特现C语言编程特点的小代码,itoa,数值转换成字符串

    #define BASE_MAX (26 + 10) char const* itostr(int x, int base) { /* map 居中, 支技负余数 */ static char con ...

  2. c语言宏定义

    一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时 ...

  3. C语言宏定义#define用法

    #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用 ...

  4. c语言宏定义详解

    1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数 ...

  5. C 语言宏定义

    C 语言宏定义1.例子如下: #define PRINT_STR(s) printf("%s",s.c_str()) string str = "abcd"; ...

  6. C# 数字转换成汉字大写 数值转换成汉字大写

    1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...

  7. 2407: C语言习题 整数转换成字符串

    2407: C语言习题 整数转换成字符串 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 917  Solved: 416[Submit][Status] ...

  8. C语言 宏定义之可变参数

    可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...

  9. 将文件大小数值转换成B、KB、MB、GB

    //delphi 将文件大小数值转换成B/KB/MB/GB function FormatByteSize(const bytes: Longint): string; const B = 1; // ...

随机推荐

  1. zk-systemd

    [Unit] Description=auto run zk server After=network.target [Service] Type=simple Environment=ZHOME=/ ...

  2. 网络性能测试工具iperf

    参考网站:https://www.cnblogs.com/yingsong/p/5682080.html https://docs.azure.cn/zh-cn/articles/azure-oper ...

  3. Spring boot @PropertySource, @ImportResource, @Bean

    @PropertySource:加载指定的配置文件 /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类 ...

  4. c++ static成员

    static 成员通常不能在类的定义体重初始化 有一种例外,const static成员可以在定义体内初始化,并且可以用于构造函数 将函数声明为const表示该函数不能修改其所属的对象

  5. tensorflow Process finished with exit code 137 (interrupted by signal 9: SIGKILL) 错误

    Process finished with exit code 137 (interrupted by signal 9: SIGKILL) 在使用tensorflow自带的数据集做手写数字识别的时候 ...

  6. FreeMarkerUtl

    /** * @title FreeMarkerUtl * @description 模板文件工具类 * @author maohuidong * @date 2017-07-05 */public c ...

  7. Matlab学以致用 - 曲线拟合

    曲线拟合 使用Matlab自带的polyfit函数,可以很方便地根据现有样本数据进行多项式曲线拟合,为了有直观感受,先上例程,如下所示: x = -:; % 样本数据x坐标 y = *x.^ + *x ...

  8. pycharm ideavimrc设置备忘

    文件存放位置 windows下 C:\Users\你的用户名\.ideavimrc 注:如果要映射pycharm 中的一些命令可以 在pycharm 中 edit->Macros->Sta ...

  9. oracle老是出现监听错误

    解决方法之一: 点击开始-->选择程序--->选中你安装的oracle版本-->选中配置与移植工具-->选中Net Configuration Assistant-->在 ...

  10. Mysql一些记忆

    mysql修改密码报错是yum 安装mysql5.7 是 出现无法登陆问题以及mysql error You must reset your password using ALTER USER sta ...