目录
1.宏格式:
2.无参宏详解:
3.宏和typedef:
4.有参宏详解:
5.无参宏说明:
6.有参宏说明:
7.宏的优点:
8.宏的缺点:
9.define与const的区别的简单总结:
无参宏是指宏名之后不带参数,最简单的宏就是无参宏。一种最简单的宏的形式如下: #define 宏名 替换文本 #define M 10 // 宏定义 #define PI 3.14 //宏定义 #define H hi; int arr[M]; // 会被替换为: int a[5] int b = M; // 会被替换为: int b = 5 printf("%d",H) ; //会输出: hi; printf("PI = %.2f\n", PI); // 输出结果为: PI = 3.14
注意宏不是语句,结尾不需要加“;”,否则会被替换进程序中,如上例: 输出: hi;如果要写宏不止一行,则在结尾加反斜线符号使得多行能连接上,如 #define HELLO "hello the wo\ rld" printf("HELLO is %s\n", HELLO); //输出结果为: HELLO is hello the wo rld
宏可以嵌套,但不参与运算: #define M 5 // 宏定义 #define MM M * M // 宏的嵌套 printf("MM = %d\n", MM); // MM 被替换为: MM = M * M, 然后又变成 MM = 5 * 5
宏定义必须写在函数之外,其作用域是 #define 开始,到源程序结束。如果要提前结束它的作用域则用 #undef 命令,如: #define M 5 // 宏定义 printf("M = %d\n", M); // 输出结果为: M = 5 #define M 100 // 取消宏定义 printf("M = %d\n", M); // error:… main.c:138:24: Use of undeclared identifier 'M'
宏定义只是简单的字符串代换,在预处理阶段完成。而typede不是简单的字符串代换,而是可以用来做类型说明符的重命名的,类型的别名可以具有类型定义说明的功能,在编译阶段完成的。
这两个结果和调用函数的方法的结果差别很大,因为如果是像函数那样的话,COUNT(x + 1)应该相当于COUNT(7),结果应该是 7 * 7 = 49,但输出结果却是21。原因在于,预处理器不进行技术,只是进行字符串替换,而且也不会自动加上括号(),所以COUNT(x + 1)被替换为 COUNT(x + 1 * x + 1),代入 x = 6,即为 6 + 1 * 6 + 1 = 13。而解决办法则是:尽量用括号把整个替换文本及其中的每个参数括起来。
说明:
(1)宏名一般用大写。
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号。
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域。
(7)宏定义可以嵌套。
(8)字符串" "中永远不包含宏。
(9)宏定义不分配内存,变量定义分配内存。
(10)宏定义不存在类型问题,它的参数也是无类型的。
1)实参如果是表达式容易出问题 #define S(r) r*r area=S(a+b);第一步换为area=r*r;第二步被换为area=a+b*a+b; 正确的宏定义是#define S(r) ((r)*(r)) (2)宏名和参数的括号间不能有空格。 (3)宏替换只作替换,不做计算,不做表达式求解。 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。 (5)宏的哑实结合不存在类型,也没有类型转换。 (6)函数只有一个返回值,利用宏则可以设法得到多个值。 (7)宏展开使源程序变长,函数调用不会。
(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。
.1.增强代码的复用性。
2.提高性能。
参考文章链接: https://blog.csdn.net/u012782049/article/details/38975591http://blog.csdn.net/imgosty/article/details/81901183http://blog.csdn.net/freeking101/article/details/79066033