C语言作为编译语言,用来向计算机发出指令,代码会经过4个环节,形成最终的文件
-
预处理
展开头文件/宏替换/去掉注释/条件编译 >> test.i main.i
编译预处理,也称预编译,g++ -E test.ii
-
编译
检查语法,生成汇编 >> test.s main.s
生成汇编g++ -S target.s
-
汇编
汇编代码转换成机器码 >> test.o main.o
汇编g++ -c target.o
-
链接
链接生成可执行文件 >> a.out
链接g++ -o target
通过添加g++ --save-temps参数,保存编译过程中生成的所有中间文件
预处理
预处理命令:
以及预处理宏:
LINE 表示正在编译的文件的行号
__FILE__表示正在编译的文件的名字__DATE__表示编译时刻的日期字符串,例如: “25 Dec 2007”
TIME 表示编译时刻的时间字符串,例如: “12:30:55”
STDC 判断该文件是不是定义成标准 C 程序 我的vs2013不是定义的标准c语言
宏函数很好用,是直接展开,在这我顺便说一下宏的好处和坏处。
宏优点1代码复用性2提高性能
宏缺点1 不可调试(预编译阶段进行了替换),2无类型安全检查3可读性差,容易出错
宏函数很皮,#define定义一个比如判断大小,替换常量,很是方便。
不过我现在也就用下,#define ERROR_POWEROFF -1,#define _CRT_SECURE_NO_WARNINGS 1这样的和编译器有关的东西,不会去写宏函数,宏函数这东西,可读性特别差,在c++中,一般用const/枚举/内联去替代宏。
但是,define宏在某些方面真的是非常好用,我很推荐