将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. tornado-简单的服务器

    安装tornado pip install tornado 安装sqlalchemy 1.大概代码的解释 import tornado.ioloop #开启循环,等待访问 import tornado ...

  2. JVM 技术分享(初级)

    一个java程序是怎样运行起来的: public class Test { public static void main(String[] args){ System.out.println(&qu ...

  3. HTML5 Canvas ( 图形的像素操作 ) getImageData, putImageData, ImgData.data

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. angular 使用服务共享数据需要注意

    在使用服务共享数据时,需要注意一些细节,否则会出现视图不刷新,也不报错这样的问题,遇到了,总结下 如下: <div ng-controller='ctr1'> <a href={{n ...

  5. c# DbProviderFactories 多数据库支持工程模式

    DbProviderFactories.GetFactory(dbProviderName) DBProviderFactory factory = DBProviderFactorys.GetFac ...

  6. ActiveMQ无法启动

    解决办法:activemq无法启动,端口被占用 用netstat -an无法查出61616被哪个进程占用(实践证明,netstat -ano|findstr '61616'什么也没有找到) 经过排查和 ...

  7. ios tableview header 透明

    当将tableview的style属性设为grouped时,header或footer会变成透明,如果设为plain,header或footer会保持默认颜色

  8. UGUI双击事件

    经测试在Android.ios平台下无效 using UnityEngine; using UnityEngine.EventSystems; using System.Collections; us ...

  9. sql查询分析器中显示行号

    -- 工具-> -- 选项-> -- 文本编辑器-> -- 所有语言-> -- 常规-> -- 显示-> -- 行号

  10. Haskell语言学习笔记(32)Data.Maybe, Data.Either

    Data.Maybe Prelude Data.Maybe> maybe "" show (Just 5) "5" Prelude Data.Maybe& ...