c程序进阶-程序环境和预处理

本章大纲

一、程序实现需要经过的两种环境

 

1)翻译环境

实际开发中是分模块开发,每个人负责自己的模块,所以会有很多个.c文件。 

每个源文件都会单独经过编译器生成自己的目标文件(windows环境下是 .obj文件

linux环境下  gcc编译器编译后生成的 目标文件是.o  文件

多个目标文件+链接库通过链接器来生成可执行程序文件(.exe文件)。

所以.c程序会经过两个程序生成可执行程序,一个是编译器,一个是链接器。

vs环境下的编译器是cl.exe    链接器是 link.exe

 预处理阶段(文本操作):

1、头文件的内容会包含 #include

2、#define 定义符号的替换  并删除原来定义的#define

3、注释删除

2)程序的运行环境:

二、预处理详解

 define

define定义标识符

define 定义宏

 

宏只完成替换

#和##

 

##

代码实现:

带有副作用的宏参数

 函数与宏的对比:

宏的优点

 宏缺点:

对比总结:

 

宏缺陷:

当参数内有操作符和宏内也有操作符会产生优先级顺序。

 解决方式:

命名习惯:

取消define指令     #undef

条件编译:

 

 

 

 

文件包含:

 头文件多次包含则会在编译时,多次重复合并头文件代码,造成代码冗余。

解决办法:

1、头文件内开头先用宏定义。(通用)

 2、#pragma once 指令(新编译器支持,老版本编译器不支持)

包含库的时候 <> 和" " 的区别

offsetof(计算结构体变量相较于它起始位置的偏移量)

实现方法:

偏移量是相对于起始地址为0位置的实际位置数。假设起始位置是0,标号4的位置,就是偏移量4的元素的首地址。

 思想:把ox00000000地址作为起始地址  表示为结构体的起始地址。然后用->引出结构体成员,并取地址后强制转换为(size_t)类型,可以得到成员相对于起始地址的偏移量。

 

补充:

续行符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值