http://hi.baidu.com/feichideche/item/f138221d97ada1fc746a84e2

宏替换顺序,这是以前在论坛里看到的一个问题,因此整理下来,供自己学习和参考:

测试程序hello.c:

#define _ToStr(x) #x

#define __ToStr(x) _ToStr(x)

#define Japan_EarthQuake 9.0

int main()

{

printf("_ToStr:%s\n",_ToStr(Japan_EarthQuake);

printf("__ToStr():%s\n",__ToStr(Japan_EarthQuake);

}

在mingw下编译得到hello.out,运行后得到结果如下:

定义两层的原因是(传入的参数可能是宏也可能是普通字符串):

【】预处理顺序:总是先将""内的东西识别为字符串,再进行宏替换或宏参数替换,即""内的宏名或宏参数名不被替换。

【】#用来给宏参数加引号。对于将表达式转化为包含这个表达式的字符串的需求,可将这个表达式定义成宏的参数exp,在宏内部用#exp来给表达式加引号。

【】宏替换顺序:一个宏的参数是另一个宏,先替换外面的宏,后替换参数。因此#define _ToStr(x) #x以后_ToStr(a+b)相当于"a+b",而#define X a+b 再_ToStr(X)的结果相当于"X"——先替换外面的宏,给X加了引号,再替换里面的宏,对""内的宏名不替换。

【】宏替换顺序:一个带参数的宏内部调用另一个宏,参数也是一个宏,则先替换外层的宏,再替换外层宏的参数,最后替换内层宏。因此采用两层转换之后,外边的宏先被替换了,但没有完全展开,然后参数被替换了(保证参数是宏时被展开),

c语言中宏替换时的顺序相关推荐

  1. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

  2. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  3. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解

    宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...

  4. python操作符顺序_Python语言中的操作符与运算顺序

    在新鲜出炉的9月TIOBE编程语言排行榜上,Python历史性的挤下C++,次进入前三位,Python的热度也以肉眼可见的速度快速上涨着,学习Python的人越来越多,不只是成人,很多青少儿也选择从P ...

  5. C语言中宏定义使用方法详解

    C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ____ ...

  6. C语言中宏定义的使用

    1. 引言 1.1 宏定义的基本语法 1.2 宏定义的优点 1.3 宏定义的缺点 1.4 宏还是函数 2 使用宏时的注意点 2.1 算符优先级问题 2.2 分号吞噬问题 2.3 宏参数重复调用 2.4 ...

  7. C语言中宏定义和函数的取舍

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  8. c语言中同级运算符的运算顺序,二 如何学习C语言的运算符和运算顺序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言的运算功能十分丰富,运算种类远多于其它程序设计语言.因此,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则 ...

  9. C语言中宏定义和函数的区别

    前言 在C语言中,对于一些常用或通用的代码段的封装可以有两种方式:函数和宏定义. 这篇博客就来带大家梳理一下对于这两种方式我们在使用时应该如何抉择,以及它们的区别和优缺点. 宏定义和函数的区别 从程序 ...

最新文章

  1. Hololens2-OpenXR开发(二)-实现通讯
  2. ROW_NUMBER() OVER函数的基本用法
  3. 19.1 Linux监控平台介绍;19.2 zabbix监控介绍;19.3,19.4 安装zabbi
  4. 如何使用Node.js获取当前脚本的路径?
  5. SCCM2007 R2部署Windows7,SCCM系列之八
  6. 百度智能云拿下MTCS最高安全评级,企业出海再添安全通道
  7. boost::hana::replace用法的测试程序
  8. JSON JsonArray和JsonObject学习资料
  9. THUPCCTSAPIO2019:Far Away
  10. 配置文件中的数据库连接串加密了,你以为我就挖不出来吗?
  11. java 获取工程编码格式_java 获取获取字符串编码格式
  12. 计算机cmd查询ip地址,cmd查ip地址(cmd命令查看别人的ip)
  13. 中兴echat_中兴高达推出新一代eChat小先锋e350
  14. 抓取网易云音乐歌曲热门评论生成词云(转)
  15. 16QAM调制解调系统误码率和星座图的matlab仿真
  16. Ubuntu 8.04 优化设置
  17. Python可视化模块——Matplotlib(2)
  18. java long 和long_java中Long和long的区别
  19. 乌班图与win10作为文件服务器,win10与子系统ubuntu之间互访文件
  20. Scilab 5.1.1使用感受

热门文章

  1. 底层实现_Redis有序集合zset的底层实现
  2. qt designer 插入图片_真的不错,宁波棉服图片
  3. c语言输入字符串的格式不正确的是,关于c#:输入字符串的格式不正确
  4. 时间控件_Selenium时间控件的处理
  5. 查看pg 用户组_PostgreSQL 角色管理
  6. linux c ip数据包,如何在Linux上的C / C ++中使用ipv6 udp套接字进行多播?
  7. Spark Streaming(三)zookeepe搭建
  8. Python 常见的17个错误分析
  9. 人脸识别(二)——训练分类器
  10. python easy install_Python 安装easy_install详解