程序环境和预处理

程序编译过程:
1.组成一个程序的每个源文件通过编译器进行编译分别转换成目标文件
2.每个目标文件由链接器链接在一起,形成一个单一的可执行程序
3.链接器会引入标准C库中的被该程序用到的函数,也可以搜索程序员个人的程序库,将程序需要的函数链接到程序中。
这里写图片描述

编译本身也分为几个阶段:
1.预编译(*.i)
预处理指令
2.编译(*.s)
语法分析,词法分析,语义分析,符号汇总
3.汇编(*.o)
形成符号表,汇编指定转换为二进制指令,生成可重定位目标文件
4.链接
合并段表,符号表的合并和符号表的重定位
( gcc编译的选项分别是 -E对应 .i 文件,-S对应 .s文件,-c对应 *.o文件 )

预处理:
1.预定义符号
__FILE__ (进行编译的源文件)
__LINE__ (文件当前的行号)
__DATE__ (文件被编译的日期)
__TIME__ (文件被编译的时间)
__STDC__(如果编译器遵循ANSI C则值为1,否则未定义)

printf("__FILE__:%s \n,__LINE__: %d \n, __DATE__:%s\n, __TIME__:%s\n", 
__FILE__, __LINE__, __DATE__, __TIME__);

#define
语法:#define name stuff
例子:#define MAX 100
          #define MAX(a,b) (((a)>(b))?(a):(b))
注:用于对表达式进行求值的宏定义都应该加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。
    #define宏替换步骤:
1.在调用宏时,首先对参数进行检查,看是否包含任何由#define定义的符号,如果是,他们首先被替换
2.替换文本随后被插入到原来文本的位置
3.再次对结果文件进行扫描,看是否包含任何#define定义的符号,如果有,重复以上步骤
(宏参数和#define定义中可以出现其他#define定义的变量,但是宏不可以出现递归;当预处理器搜索#define定义的符号的时候,字符串常量的内容不被搜索)
(使用#可以使一个宏参数变成对应的字符串)

#define PRINT(FORMAT,VALUE) printf("the value of "#VALUE" is "FORMAT" \n",VALUE);
    int i = 0;
    PRINT("%d", ++i);

优缺点:
优点:
1.宏比函数在在程序规模和速度上要好。因为调用函数然后返回的开销比实际执行这个计算需要的时间更多。
2.宏是类型无关的。函数参数必须声明为特定的类型,而宏并不需要。
缺点:
1.每次使用宏,都将有一份代码被替换插入当前位置,如果宏比较长,就会使程序的长度增长
2.宏没办法调试
3.宏因为类型无关,不够严谨
4.宏可能带来运算符优先级的问题,容易导致出错
这里写图片描述

#undef
用于移除一条宏定义
语法:#undef name

条件编译:
//常量表达式由预处理器求值
1.
#if 常量表达式
  //…
#endif

2.
#if 常量表达式
  //…
#elif 常量表达式
  //…
#else
  //…
#endif

文件包含:
#include
#include指令可以使另外一个文件被编译,就像那个文件实际出现在这里一样
包含方式:
1.本地包含
#include”filename”
先在源文件所在目录下查找,如果该文件没有找到,编译器就像查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误。(linux下标准头文件路径:/usr/include )
2.库文件包含
#include< filename >
查找头文件直接去标准路径下去找,如果找不到就提示编译错误

避免头文件的重复引入:
#ifndef __FILENAME_H__
#define __FILENAME_H__
//头文件内容
#endif __FINENAEM_H__

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值