C语言第八课 预处理

无参数的宏定义:


宏定义的几点说明:

1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不做任何检查,如有语法错误,只能在编译已被宏展开后的源程序时发现。

2.宏定义不是说明或者语句,在行末不必加分号,如加上分号则连分号一起被置换。
C语言第八课 预处理_第1张图片

3.宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束,如要终止其作用域可以使用 #undef命令。

4.宏名在源程序中若用引号括起来,则预处理程序不对其做宏代换。


C语言第八课 预处理_第2张图片


5.宏定义需要嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换

6.习惯上宏名用大写字母表示,以便于与变量区别,但也可以用小写字母

C语言第八课 预处理_第3张图片
C语言第八课 预处理_第4张图片



7.可以用宏定义表示数据类型,使书写更加方便。可以提升可移植性


区别: 宏定义只是简单的字符串代换,是在预处理的时候完成的,而typedef是在编译时处理的,他不是简单的替换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能。

C语言第八课 预处理_第5张图片


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:b

2.在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须做类型说明
这个与函数中的情况不同,在函数中,形参和实参是两个不同的量,各自有各自的作用域,调用时要把实参值赋予形参,进行”值传递“。而在带参宏中,只是符号代换,不存在值传递的问题。

C语言第八课 预处理_第6张图片

C语言第八课 预处理_第7张图片


3.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

4.在宏定义中,字符串内的形参要用括号括起来以避免出错。



C语言第八课 预处理_第8张图片

检查是否有 CORRECT这个 定义,如果没有那么就定义一个。

C语言第八课 预处理_第9张图片

如果定义的 ROUND是 1 那么就执行 第一段代码。否则就执行第二段代码



你可能感兴趣的:(C语言基础,C语言基础)