将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. UVA-755-排序

    奇怪,我怎么还有一个排序题目没过 题意如下: 公司喜欢有难忘的电话号码,一个让电话号码变得难忘的方式是有一个拼读起来难忘的单词,比如,你可以呼叫University of Waterloo通过拨打难忘 ...

  2. C语言中字符串存储方法

    众所周知,C语言中没有数据类型能够存储字符串, char数据类型仅仅能够存储一个字符的数据,那么在C语言中关于存储字符串这一难题我们改何去何从呢? 下面将详述相关的字符串存储方法; 1,使用字符数组存 ...

  3. LINUX漏洞-安全防护--防火墙相关

    漏洞扫描 https://blog.csdn.net/e_Inch_Photo/article/details/79072360 基本安全防范: https://blog.csdn.net/holmo ...

  4. leetcode50

    public class Solution { public double MyPow(double x, int n) { return Math.Pow(x, (double)n); } }

  5. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

  6. 迷你MVVM框架 avalonjs 学习教程14、事件绑定

    之前的章节许多示例代码也或多或少地展示了如何使用ms-click来绑定事件了.能直接在模板上绑定是事件,这也是静态模板与动态绑定的一大区别.ms-click不是简单的onclick的别名,它在内部屏蔽 ...

  7. The requested resource (/) is not available解决办法

    The requested resource (/) is not available HTTP Status 404(The requested resource is not available) ...

  8. 利用Spark-mllab进行聚类,分类,回归分析的代码实现(python)

    Spark作为一种开源集群计算环境,具有分布式的快速数据处理能力.而Spark中的Mllib定义了各种各样用于机器学习的数据结构以及算法.Python具有Spark的API.需要注意的是,Spark中 ...

  9. 出现了npm ERR! cb() never called!错误

    执行npm i 命令时,出现了npm ERR! cb() never called!错误 解决方案: 1.首先清除你的npm缓存: sudo npm cache clean -f 一般情况执行完后再试 ...

  10. 使用HTTP头去绕过WAF(bypasswaf)

    在用node http get 请求的时候,发现的 解决方案: Add headers to all Burp requests to bypass some WAF products. This e ...