c语言 define宏名称if(参数),宏编程基础内容
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
使用过word软件可能知道里面有个功能就是宏录制,可以录制一系列的操作,然后在之后的工作中,快速插入一组操作,减少重复性的工作,提高了效率。编程中的宏,和这个道理一样,也是宏替换。下面先看下C语言中常见的宏命令。
C语言程序的编译过程,简单可分为预处理、编译、中间代码.o文件、链接、目标代码。预处理阶段,通过各种编译器的预处理器(Preprocessor),将.c文件中的宏替换,条件编译指令,头文件包含,特殊符号,以及typedef类型定义。
其中预处理器工作有:文件包含:可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。
条件编译:预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外。
宏展开:预处理器将源程序文件中出现的对宏的引用展开成相应的宏定义。
预处理中宏的作用:方便程序的修正:将某个特定数量在程序中出现的所有实例统统加以修改。
提高程序的运行效率:C语言在实现函数调用时会带来重大系统开销,宏可以实现一种这样的程序块:它看上去像函数,但却没有函数调用的开销。
#include :引入头文件,也就是替换头文件的内容到此处。
#define : 定义一个宏不带参数的宏定义:#define
带参数的宏定义: #define ()
#if、#elif 、#else、#endif: 条件编译,类似if选择语句,不过是根据条件选择代码块进行编译
#ifdef、 #ifndef、#undef、#if defined、#if !defined: 判断是否定义,未定义以及取消某个宏
还有调试时使用的一些宏:__LINE__: 内置宏,代表该行代码的所在行号
__FILE__: 内置宏 代表源文件的文件名
__DATE__: 表时间,形式为月/日/年的字符串,表示源文件被翻译到代码时的日期
__TIME__ : 表时间,形式为时:分:秒的字符串,
__STDC__ : 如果实现遵循ANSI规定的C标准,是十进制的数字1,否则不为1
__VA_ARGS__ :可变参数
类似标签特殊作用的宏:# : 字符串化标签,把“#”标签右边的内容转换成字符串
## : 连接标签,连接“##”标签左右的内容连接在一起
宏的一些常见应用
1、 定义简单的字面量,进行替换1
2
3#define kAllCount 13
#define kIdentifier @"identifier"
2、代替简单的函数功能1
2
3#define sum(x,y) x+y // 代替函数求和
#define multiplication(x,y) x*y // 代替函数求积
实际上上面的两个宏的使用是不严谨的,因为宏只是简单的替换,如上面的宏的参数x和y并不仅仅是数字还可能是表达式,下面测试下。1
2
3
4
5
6
7
8
9
10
11
12
13
14NSLog(@"muti result is: %d", multiplication(2, 10));
NSLog(@"sum result is: %d", sum(2, 10));
NSLog(@"muti result is: %d", multiplication(2+3, 10));
NSLog(@"sum result is: %d", sum(2+3, 10));
跑出来的结果如下:
2014-08-09 11:03:58.346 Test[3576:402410] muti result is: 20
2014-08-09 11:03:58.346 Test[3576:402410] sum result is: 12
2014-08-09 11:03:58.346 Test[3576:402410] muti result is: 32
2014-08-09 11:03:58.346 Test[3576:402410] sum result is: 15
可以看第三个输出和我们预想的不一样,分析一下就发现multiplication(2+3, 10)替换后的结果是2+3*10,因为宏只是简单的替换,所以在使用中要特别注意这一点。解决方法就是把#define multiplication(x,y) x*y 改为 #define multiplication(x,y) (x)*(y)。重新测试下,结果和预期的一样。1
2
3
4
5
6
7
8
9
10
11
12
13
14NSLog(@"muti result is: %d", multiplication(2, 10));
NSLog(@"sum result is: %d", sum(2, 10));
NSLog(@"muti result is: %d", multiplication(2+3, 10));
NSLog(@"sum result is: %d", sum(2+3, 10));
跑出来的结果如下:
2014-08-09 11:11:02.008 Test[3576:402410] muti result is: 20
2014-08-09 11:11:02.009 Test[3576:402410] sum result is: 12
2014-08-09 11:11:02.009 Test[3576:402410] muti result is: 50
2014-08-09 11:11:02.009 Test[3576:402410] sum result is: 15
3、 用于控制1
2
3
4
5
6
7
8
9
10
11
12#define DebugMode
#define NormalMode
#ifdef DebugMode
加载A代码块
#else
加载B代码块
#endif
c语言 define宏名称if(参数),宏编程基础内容相关推荐
- c语言 define宏名称if(参数),iOS深思篇 | 宏定义
一. 简介 宏是一种批量处理的称谓,简单来说就是根据定义好的规则替换一定的文本.替换过程在程序编译期,也因此大量使用宏会造成编译时间变长:而且替换过程不进行类型安全检查;还需要注意"边缘效应 ...
- 大牛深入浅出讲解C语言#define宏定义应用及使用方法
在C语言中,我们使用#define来定义宏.在C程序编译的预处理阶段,预处理器会把宏定义的符号替换成指定的文本. 不带参数的宏 关于宏最常见的就是用来定义数值常量的名称,即没有参数的宏定义,采用如下形 ...
- 深入浅出讲解C语言#define宏定义应用及使用方法
在C语言中,我们使用#define来定义宏.在C程序编译的预处理阶段,预处理器会把宏定义的符号替换成指定的文本. 不带参数的宏 关于宏最常见的就是用来定义数值常量的名称,即没有参数的宏定义,采用如下形 ...
- 深入理解C语言——#define宏和枚举的区别
(1)从处理过程的角度看: #define宏是由编译预处理器在预编译处理时处理的,而且只做简单的字符串的替换.枚举常量则是在编译的时候确定其值的. (2)从调试的角度看: 通常情况下,在编译器里,可以 ...
- makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术
微信限制:不能放置链接,代码样式比较奇怪,发布后不能更新... 推荐 阅读原文: 写在前面 之前写过几篇关于 C/C++ 宏 (macro) 和 C++ 元编程 (metaprogramming) 的 ...
- 关于C语言define宏定义字符串常量
1.问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换:但是最近在工作中遇到了字符串宏+1的情况:于是彻底的颠覆了以前的思维:于是乎进行测试验证得出以下结果. 2.测试代码 /*测试 ...
- C语言#define宏定义可能注意不到的地方
#define使用的核心:直接替换 我也觉得自己很清楚这一点,但看到这一道输出程序片段结果题,还是懵了.大家也可以在不看我下方答案的情况下,自己做一下,题目如下: #include<stdio. ...
- 关于C语言刷题(#define宏定义函数的常见错误)
关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种.分为无参宏定义和带参宏定义.无参宏定义的一般形式为:#defi ...
- C语言 | 预处理 | 宏定义 | #define | 定义函数
文章目录 预处理 预处理运算符 宏定义 无参宏定义 带参宏定义 宏定义-定义函数 此文主要介绍宏定义,并在介绍宏定义时举例介绍预处理命令 预处理 参考:C 预处理器 | 菜鸟教程 重要的预处理器指令如 ...
最新文章
- html在页面上div绝对定位,html – 中心浮动div在绝对定位div内
- Kotlin的解析(中)
- php flink,plus/flink.php · 辉辉菜/三强源码 - Gitee.com
- 直播分享|邓文彬:如何在GPU/CPU/移动端高效训练和推断CNN网络
- wxWidgets:wxMultiChoiceDialog类用法
- react循环setstate_[React] 8 - React 自身或工程性能优化点?
- Java 获取当前项目的类路径
- docker学习笔记18:Dockerfile 指令 VOLUME 介绍
- C++之static关键字探究
- Lintcode57 3Sum solution 题解
- vue获取client为0_vue document.documentElement.clientHeight为0
- Thinkpad E475换装Win7后,网络连接无故中断无法再次连接的问题
- VMware桥接模式下虚拟机ping主机不通
- LSTM之父发文:2010-2020,我眼中的深度学习十年简史
- 门控时钟:Clock fating
- 拖动图形验证码(极验验证)
- 用Intellij IDEA 创建第一个Spring MVC项目
- eclipse设置maven archetype
- kmp算法中字符串前后缀公共长度的总结
- 计算机科学与技术发表文章,计算机科学与技术学院粆倩文老师的文章在顶级学术期刊IEEE TVCG上发表...
热门文章
- 学习计划Current(2019.4.23)
- Build your own distribution based on Fedora CoreOS
- 大页内存的使用:HugePages(大内存页)的原理与使用
- Linux开机启动过程(4):切换到64位模式-长模式(直到内核解压缩之前)
- (2)Linux进程调度器-CPU负载
- mac上sublime配置php环境,Mac下sublime text3如何配置php编译环境?
- c# npoi 公式不计算_玉米扣量因素:水分、杂质、不完善粒、生霉粒,检测方法及计算公式...
- web前端基础(01html基本标签)
- easyui datagrid如何自适应浏览器的宽度和高度
- mysql2005本地连接_sql2005连接配置详细图解