将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. 表单:提交验证,及blur事件验证

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. leetcode202

    public class Solution { private int SumSqares(int n) { //将一个数字的各个数位的值分开存储 var list = new List<int ...

  3. start 调用外部程序

    批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令 例:start explore ...

  4. python global nonlocal

    global: 方法之外在modual中的变量定义为全局变量.方法内的变量为局部变量. 一般情况下,全局变量可以被使用,但是不应该被修改,不然会报错. 不过一般不建议对全局变量做修改,如果有多个方法都 ...

  5. java.util包简介

    java.util包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期Date类.堆栈Stack类.向量Vec ...

  6. java流输入输出

    java读取txt文件内容.可以作如下理解:  首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了.  通过这条 ...

  7. JAVA中的异常疑点解析

    1 final, finally, finalize的区别. final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承. 内部类要访问局部变量,局部变量必须定义成final类型 ...

  8. 抽象类(abstract class)

    package com.bjsxt.oop.abstractClass; //抽象类 public abstract class Animal { //因为父类的方法总是被重写 那就没写的必要了 但是 ...

  9. 3.3 JSP内置对象概述

    1.request 1.1 request获取页面传来的参数,参数通过浏览器网址和后面添加?的方式传达. 传参:”show.jsp?id=001” 获取参数:request.getParameter( ...

  10. TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架

    TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架 http://blog.sina.com.cn/s/blog_4b0020f30102wv4l.html