1. C语言中的宏定义
(1)#define是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不做语法检查)
(2)#define定义的宏可以出现在程序的任意位置(包括函数体的内部)
(3)#define定义之后的代码都可以使用这个宏
2. 定义宏常量
(1)#define定义的宏常量可以直接使用
(2)#define定义的宏常量本质为字面量
【实例分析】宏定义分析
test.c源文件 | 经过预处理器宏替代后的文件(test.i) |
#define ERROR -1 #define PATH1 "D:\test\test.c" #define PATH2 D:\test\test.c //最后一个字符是接续符,会接下一行。 #define PATH3 D:\test\ test.c int main() { int err =ERROR char* p1 = PATH1; char* p2 = PATH2; char* p3 = PATH3; return 0; } |
# 1 "test.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "test.c" # 9 "test.c" int main() { int err =-1 char* p1 = "D:\test\test.c"; char* p2 = D:\test\test.c; //直接替换,不做语法检查 char* p3 = D:\testtest.c; //直接替换,不做语法检查 return 0; } |
3. 宏定义表达式
(1)#define表达式的使用类似函数调用
(2)#define表达式可以比函数更强大
(3)#define表达式比函数更容易出错
【实例分析】宏表达式分析
4. 宏表达式与函数的对比
(1)宏表达式被预处理器处理,编译器不知道宏表达式的存在
(2)宏表达式用“实参”完全替代形参,不进行任何运算。
(3)宏表达式没有任何的“调用”开销
(4)宏表达式中不能出现递归定义。
5. 有趣的问题——宏定义的常量或表达式是否有作用域限制?
【实例分析】宏的作用域分析
6. 强大的内置宏
宏 |
含义 |
示例 |
__FILE__ |
被编译的文件名 |
file1.c |
__LINE__ |
当前行号 |
25 |
__DATE__ |
编译时的日期 |
Mar 27 2016 |
__TIME__ |
编译时的时间 |
16:36:15 |
__STDC__ |
编译器是否遵循标准C规范 |
1 |
【实例分析】宏使用综合示例
7.小结
(1)预处理器直接对宏进行文本替换
(2)宏使用时的参数不会进行求值和运算
(3)预处理器不会对宏进行语法检查
(4)宏定义时出现的语法错误只能被编译器检测
(5)宏定义的效率高于函数调用
(6)宏的使用会带来一定的副作用
原文:http://www.cnblogs.com/5iedu/p/5326180.html