c语言编译预处理的作用,C语言的编译预处理

1、C程序的过程

7f5517ae69719b67cd75357c20a5e37e.png

处理流程:

85a98432340624c089fef892c662082c.png

静态链接与动态链接:

996f1067622276673dc3d9e9d8ff08d3.png

链接可以分为静态链接(静态库)与动态链接(共享库):

静态库是代码的归档,在使用静态库时是采用的复制代码的方式。共享库是可执行文件的组成部分,在使用共享库时是采用的提供代码在共享库的地址给可执行文件的方式。

3d0ecb93e1c5499a22a8b65a026e1209.png

GCC编译器:区分大小写

gcc -E : 只做预处理,其它都不做,(.i)

gcc -S : 检查语法错误等,生成汇编文件(.s)

gcc -c : 完成汇编,不链接(.o)

gcc -o : 修改目标文件名

gcc : 编译+链接,生成可执行文件,默认是 a.out

gcc -Wall : 生成所有的警告信息(提示代码质量,少警告)

Gcc -D宏名: 条件编译,用于版本选项开关

包含头文件的方法:

aafde84c564f1e98fcac5c5ccf367885.png

宏定义与使用分析:

d87a8df83d0147d1596d28d8202ee45c.png

内置宏:

c3fb08155d82d484310ae7fd4c0739fc.png

条件编译使用:

条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码

#if…#else…#endif被预编译器处理;而if…else语句被编译器处理,必然被编译进目标代码

实际工程中条件编译主要用于一下两种情况:

不同的产品线共用一份代码;区分编译产品的调试版和发布版

#error(#warning)和#line :

#error用于生成一个编译错误消息,并停止编译

用法: #error message (message不需要用双引号包围)

#error编译指示字用于自定义程序员特有的编译错误消息类似的,#warning用于生成编译警告,但不会停止编译

#line用于强制指定新的行号和编译文件名,并对源程序的代码重新编号

用法: #line number filename (filename可省略)

#line编译指示字的本质是重定义__LINE__和__FILE__

#pragma预处理:

#pragma GCC dependency 文件名 (已使用版本控制代替)

把当前文件和指定文件之间建立依赖关系,如果当前文件最后修改时间比指定文件新,就没问题,否则就产生警告

#pragma GCC poison 标识符或关键字

把后面的标识符或关键字禁止使用

#pragma pack(数字)

针对结构体的对齐补齐

Struct占用内存大小分析:

第一个成员起始于0偏移处

每个成员按其类型大小和指定对齐参数n中较小的一个进行对齐

偏移地址和成员占用大小均需对齐

结构体成员的对齐参数为其所有成员使用的对齐参数的最大值结构体总长度必须为所有对齐参数的整数倍

#和##运算符使用:

5710e221b4ddbe03f8a244cb0d3775d5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值