首页 > 其他 > 详细

第21课 宏定义与使用分析

时间:2016-03-27 17:49:07      阅读:206      评论:0      收藏:0      [点我收藏+]

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)宏的使用会带来一定的副作用

第21课 宏定义与使用分析

原文:http://www.cnblogs.com/5iedu/p/5326180.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!