简谈编译中的预处理阶段

我们都知道像C语言这样的编译型语言是要经过编译、链接才能形成可执行文件的。其中编译又分为预处理、编译、汇编,今天我们就简谈一下预处理阶段发生事情。

一.预定义符号(可直接使用,在预处理阶段会替换为其代表的信息)

1.__FILE__(当前编译的文件)

2.__DATE__(文件编译的日期)

3.__TIME__(文件编译的时间)

4.__STDC__(若编译器遵循ANSIC,其的值为一,否则是未定义)

5.__LINE__(文件当前的行号)

代码演示(我用的是VS):

二.#define定义

1.#define定义的常量(会在预处理阶段查找替换定义的符号,替换后会把#define这条语句删掉)其不仅可以定义数也可以定义一条代码等。

例如:

注意:其是直接替换,要是表达式其不会计算完再替换,所以适当加上括号很重要。

例如:

2.#define定义的宏(可达到函数的效果,但与函数还是有区别的)

例如:

3.宏和函数的对比

4.#undef  用于清除#define定义的符号,清除后将无法使用该符号代表的内容。

5.注意:#define不会查找字符串中的量。当宏的参数中有#define定义的量时,会被优先替换。

三.条件编译指令

1.单分支选择指令  (#if 常量表达式   #endif)

例如:

2.多分支选择指令   (#if  #elif  #else  #endif)

例如:

3.判断是否定义指令   (#ifdef   #endif)

用法如下:

4.避免一个头文件被多次引用  (#ifndef  #define  #endif或#pragma once)这个在大型工程中为保证程序效率还是相当有必要写的。

例如:

四.本地头文件和库头文件的区别

1.包含本地头文件要用#include“”而包含库的头文件要用#include<>

2.查找策略不同:找本地头文件时会优先在.c文件的目录下查找,找不到会像找库的头文件一样在标准位置查找,再找不到就会报编译错误。而找库的头文件时,会直接在标准位置查找,找不到就报编译错误。

思考:库的头文件可不可以用#include""来包含,为什么?有无缺点?

OK,今天就说到这里吧,有什么不足请大家及时指出。思考的答案我会放到评论区。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值