基本原则:

在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。

#是在定义两边加上双引号

#define _TOSTR(s) #sprintf(_TOSTR(test ABC))
printf(_TOSTR("test ABC"));
printf(_TOSTR(_TOSTR(test ABC)));==================
预编译结果:
printf("test ABC")
printf("\"test ABC\"");
printf("_TOSTR(test ABC)");

##是原样代入

#define HI_BOY HiBoy!
#define __ORIGINAL(s) s
#define _TOSTR(s) #s
#define STR_CONCAT(x, y) x##yprintf(HI_BOY);
printf(__ORIGINAL(HI_BOY));
printf(_TOSTR(HI_BOY));
printf(_TOSTR(__ORIGINAL(HI_BOY)));
printf(STR_CONCAT(HI_BOY, HI_BOY ));
printf(STR_CONCAT(_TOSTR(HI_BOY), _TOSTR(HI_BOY) ));
===========================================================
预处理后的结果:
printf(HiBoy!);
printf(HiBoy!);
printf("HI_BOY");
printf("__ORIGINAL(HI_BOY)");
printf(HI_BOYHI_BOY);
printf("HI_BOY" "HI_BOY");

连续的两个双引号会被忽略掉

以下写法结果一样:

printf("this is a test sentence. are you ok?\n");
printf("this is a test ""sentence."" are you ok?\n");
printf("this is a test sentence."   " are you ok?\n");
printf("this is a"           " test ""sentence. are"" you ok?\n");==============
this is a test sentence. are you ok?
this is a test sentence. are you ok?
this is a test sentence. are you ok?
this is a test sentence. are you ok?

嵌套

#define  QUOTATION "
#define HI_BOY HiBoy!
#define __ORIGINAL(s) s
#define _TOSTR(s) #s
#define STR_CONCAT(x, y) x##yprintf(HI_BOY);
printf(__ORIGINAL(HI_BOY));
printf(_TOSTR(HI_BOY));
printf(_TOSTR(__ORIGINAL(HI_BOY)));
printf(STR_CONCAT(HI_BOY, HI_BOY ));
printf(STR_CONCAT( _TOSTR(HI_BOY), _TOSTR(HI_BOY) ));
printf(                  STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ));
printf(           _TOSTR(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )));
printf(_TOSTR(__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))));
printf(           ""(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))"");
printf(_TOSTR(__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))));
printf(           QUOTATION(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))QUOTATION);
printf(           QUOTATION STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )QUOTATION);==================================================
预编译结果:
printf(HiBoy!);
printf(HiBoy!);
printf("HI_BOY");
printf("__ORIGINAL(HI_BOY)");
printf(HI_BOYHI_BOY);
printf("HI_BOY" "HI_BOY");
printf(                  HiBoy!HiBoy!);
printf(           "STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )");
printf("__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))");
printf(           ""(HiBoy!HiBoy!)"");
printf("__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))");
printf(           "(HiBoy!HiBoy!)");
printf(           " HiBoy!HiBoy! ");

c语言宏嵌套和展开规则相关推荐

  1. php标签嵌入规范,HTML标签嵌套的详细规则

    这次给大家带来HTML标签嵌套的详细规则,HTML标签嵌套的注意事项有哪些,下面就是实战案例,一起来看一下. 最近在重新学习HTML的知识,算是对HTML的一个重新认识吧!别小看了这东西,一切的网页可 ...

  2. c语言 宏定义 条件,c语言宏定义、条件编译

    笔记整理: 宏定义 宏定义的一般形式为: #define 宏名 字符串或者表达式 预处理的工作就是替换,就是将宏名替换成相应的字符串与表达式. 宏定义字符串: #define 宏名 字符串 该示例中的 ...

  3. c语言宏编译命令大全,C语言宏定义与预编译详解

    http://blog.csdn.net/findaway123/article/details/6994203 2011 1.宏定义和函数的区别 -------------------------- ...

  4. 递归python首尾相同的子字符串_推荐Python语言多层嵌套list的递归处理方法

    本文主要向大家介绍了Python语言多层嵌套list的递归处理方法,希望对大家学习Python语言有所帮助. 问题:用Python处理一个多层嵌套list['and', 'B', ['not', 'A ...

  5. 转载--c语言宏定义(1)

    作者:独舞风 链接:c语言宏定义(1) 1.为什么要有宏定义? 代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新:即便某个 ...

  6. c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro, in which we can pass the arguments. When a Macro ...

  7. C语言宏的特殊用法和几个坑

    原文请见 C语言宏的特殊用法和几个坑 一宏基础 标示符别名 宏函数 二宏特殊用法 字符串化Stringification 连接Concatenation 二几个坑 语法问题 算符优先级问题 分号吞噬问 ...

  8. C语言结构体字节对齐规则

    C语言结构体字节对齐规则 基本规则 规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在 ...

  9. c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()

    暂时感觉像是由于":"的原因,关于使用习惯方面的问题!! 下面是copy的: 这样的宏见过么: Cpp代码 #define FOO(x) do {\ some_code_line_ ...

最新文章

  1. Python自动化3.0-------学习之路-------函数!
  2. STM32单片机硬件I2C驱动程序(查询方式)
  3. 长春市计算机学校老照片,松江这所学校一百年啦!一组老照片回忆曾经的旧时光…...
  4. go chan 缓存与阻塞
  5. 传统公司部署OpenStack(t版)简易介绍(七)——cinder模块部署
  6. scalar parameter xxxxx created globally in function xxxx
  7. SAP Cloud for Customer和SAP S4HANA的Customer - Business partner
  8. loj#2143. 「SHOI2017」组合数问题
  9. requests模块相关用法
  10. 【JAVA 第三章 流程控制语句】课后习题 温度转换
  11. 前端项目集成 stylelint
  12. L3-025 那就别担心了 (30 分)-PAT 团体程序设计天梯赛 GPLT
  13. torch.index_select与torch.gather
  14. (zt)svn 随服务器启动
  15. 传输层协议(7):滑动窗口(1)
  16. 北京化工大学研究生学堂在线矩阵论及其应用答案
  17. 电骡服务器搜索文件排序,电骡搜中文名资源一定要注意的技巧及其他
  18. 饿了么分布式服务治理及优化经验
  19. minigui 3.2.0:基于miniStudio应用TrueType字体的过程(1)
  20. C#工作总结(一):Fleck的WebSocket使用

热门文章

  1. linux内核定义的常用信号6,Linux中的信号
  2. endnote能自动翻译吗_人工智能能翻译古文吗?跟小编点评专业翻译PK人工智能翻译...
  3. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
  4. Python自动生成企业合同
  5. qemu模拟Cortex-A57运行Linux4.5.1
  6. P2216 理想的正方形 单调队列 (二维)
  7. echarts 横纵分割线颜色透明度
  8. 在Ubuntu 16.04.3 LTS上安装Go 1.10
  9. Vyond制作2D动画学习教程
  10. 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)