c语言宏嵌套和展开规则
基本原则:
在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。
#是在定义两边加上双引号
#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语言宏嵌套和展开规则相关推荐
- php标签嵌入规范,HTML标签嵌套的详细规则
这次给大家带来HTML标签嵌套的详细规则,HTML标签嵌套的注意事项有哪些,下面就是实战案例,一起来看一下. 最近在重新学习HTML的知识,算是对HTML的一个重新认识吧!别小看了这东西,一切的网页可 ...
- c语言 宏定义 条件,c语言宏定义、条件编译
笔记整理: 宏定义 宏定义的一般形式为: #define 宏名 字符串或者表达式 预处理的工作就是替换,就是将宏名替换成相应的字符串与表达式. 宏定义字符串: #define 宏名 字符串 该示例中的 ...
- c语言宏编译命令大全,C语言宏定义与预编译详解
http://blog.csdn.net/findaway123/article/details/6994203 2011 1.宏定义和函数的区别 -------------------------- ...
- 递归python首尾相同的子字符串_推荐Python语言多层嵌套list的递归处理方法
本文主要向大家介绍了Python语言多层嵌套list的递归处理方法,希望对大家学习Python语言有所帮助. 问题:用Python处理一个多层嵌套list['and', 'B', ['not', 'A ...
- 转载--c语言宏定义(1)
作者:独舞风 链接:c语言宏定义(1) 1.为什么要有宏定义? 代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新:即便某个 ...
- c语言宏函数怎么传递宏参数_C语言中的宏参数评估
c语言宏函数怎么传递宏参数 We can define a function like Macro, in which we can pass the arguments. When a Macro ...
- C语言宏的特殊用法和几个坑
原文请见 C语言宏的特殊用法和几个坑 一宏基础 标示符别名 宏函数 二宏特殊用法 字符串化Stringification 连接Concatenation 二几个坑 语法问题 算符优先级问题 分号吞噬问 ...
- C语言结构体字节对齐规则
C语言结构体字节对齐规则 基本规则 规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在 ...
- c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()
暂时感觉像是由于":"的原因,关于使用习惯方面的问题!! 下面是copy的: 这样的宏见过么: Cpp代码 #define FOO(x) do {\ some_code_line_ ...
最新文章
- Python自动化3.0-------学习之路-------函数!
- STM32单片机硬件I2C驱动程序(查询方式)
- 长春市计算机学校老照片,松江这所学校一百年啦!一组老照片回忆曾经的旧时光…...
- go chan 缓存与阻塞
- 传统公司部署OpenStack(t版)简易介绍(七)——cinder模块部署
- scalar parameter xxxxx created globally in function xxxx
- SAP Cloud for Customer和SAP S4HANA的Customer - Business partner
- loj#2143. 「SHOI2017」组合数问题
- requests模块相关用法
- 【JAVA 第三章 流程控制语句】课后习题 温度转换
- 前端项目集成 stylelint
- L3-025 那就别担心了 (30 分)-PAT 团体程序设计天梯赛 GPLT
- torch.index_select与torch.gather
- (zt)svn 随服务器启动
- 传输层协议(7):滑动窗口(1)
- 北京化工大学研究生学堂在线矩阵论及其应用答案
- 电骡服务器搜索文件排序,电骡搜中文名资源一定要注意的技巧及其他
- 饿了么分布式服务治理及优化经验
- minigui 3.2.0:基于miniStudio应用TrueType字体的过程(1)
- C#工作总结(一):Fleck的WebSocket使用
热门文章
- linux内核定义的常用信号6,Linux中的信号
- endnote能自动翻译吗_人工智能能翻译古文吗?跟小编点评专业翻译PK人工智能翻译...
- Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
- Python自动生成企业合同
- qemu模拟Cortex-A57运行Linux4.5.1
- P2216 理想的正方形 单调队列 (二维)
- echarts 横纵分割线颜色透明度
- 在Ubuntu 16.04.3 LTS上安装Go 1.10
- Vyond制作2D动画学习教程
- 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)