C语言第八课 预处理
来源:互联网 发布:中科院学位论文数据库 编辑:程序博客网 时间:2024/05/22 05:22
无参数的宏定义:
宏定义的几点说明:
1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不做任何检查,如有语法错误,只能在编译已被宏展开后的源程序时发现。
2.宏定义不是说明或者语句,在行末不必加分号,如加上分号则连分号一起被置换。
3.宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束,如要终止其作用域可以使用 #undef命令。
4.宏名在源程序中若用引号括起来,则预处理程序不对其做宏代换。
5.宏定义需要嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换
6.习惯上宏名用大写字母表示,以便于与变量区别,但也可以用小写字母
7.可以用宏定义表示数据类型,使书写更加方便。可以提升可移植性
区别: 宏定义只是简单的字符串代换,是在预处理的时候完成的,而typedef是在编译时处理的,他不是简单的替换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能。
8.对”输出格式“作为宏定义,可以减少书写麻烦。
带参数的宏定义:
C语言允许带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式 : #define 宏名( 形参表 ) 字符串
带参宏调用的一般形式为 : 宏名 ( 实参表 ) :
例如 : #define M( y ) y*y + y* 3
.... k = M( 5 ) ; // 这个的值就是 5 * 5 + 5 * 3 = 40
宏定义的几点说明:
1. 带参宏定义中,宏名和形参表之间不能有空格出现。 例如 : 不能写成 #define MAX ( a , b) (a > b)?a:b2.在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须做类型说明
这个与函数中的情况不同,在函数中,形参和实参是两个不同的量,各自有各自的作用域,调用时要把实参值赋予形参,进行”值传递“。而在带参宏中,只是符号代换,不存在值传递的问题。
3.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
4.在宏定义中,字符串内的形参要用括号括起来以避免出错。
检查是否有 CORRECT这个 定义,如果没有那么就定义一个。
如果定义的 ROUND是 1 那么就执行 第一段代码。否则就执行第二段代码
阅读全文
0 0
- C语言第八课 预处理
- C语言第八课
- C语言第八课
- c语言预处理
- C语言预处理指令
- C语言-预处理程序
- C语言-预处理程序
- C语言编译预处理
- C语言-预处理程序
- C语言-预处理程序
- C语言预处理指令
- C语言-预处理命令
- C语言-预处理
- C语言预处理命令
- C语言-预处理程序
- C语言预处理器
- C语言```预处理
- C语言预处理
- Android res/raw和assets的区别和使用
- 《iOS开发笔记-触摸事件与手势》
- ES6语法(10)
- 如何得到系统时间
- MySQL分区表效率测试对比1
- C语言第八课 预处理
- 添加元件库,搜索元件,放置元件
- eclipse怎样创建并运行java项目
- Date类、Calendar类与SimpleDateFormat类-Java基础063
- android 简单实现GridView的Item逐个加载和动画效果
- java swing 窗口和控件自适应大小
- (个人)AR电子书系统创新实训第三周(1)
- Spring Boot打包总结
- 怎么理解,java语言是跨平台的?即什么是跨平台?C也说自己是跨平台的,怎么理解?