c语言-预处理
2019-03-21 本文已影响0人
gcrisis
编译过程
-E 预编译 生成*.i文件,进行文本级别的处理。
-S 编译 将.i文件编译成汇编代码
-C 汇编编译,将汇编代码编译成二进制文件。
编译出错后可以通过上面三个参数编译不同的阶段来调试。
链接
将各个模块链接到一起,构成可执行文件。
分类:动态和静态
宏
使用宏参数尽量只用常数,用其他表达式很可能出错。
宏在处理数组时比函数方便些。
#define dim(a) (sizeof(a)/sizeof(*a) )
宏不能递归调用。
#undef用于结束一个宏的定义。
内置宏
__FILE__、__DATE__、__LINE__、__TIME__、__STDC__
系统日志常常使用宏实现,配合do while循环再结合内置宏可以很好的构造日志函数。
条件编译
使用-Dxxx 在编译阶段指定宏或者宏的参数。
主要用途:不同的产品共用一套代码;发布版本与调试版本的区分。
#error和#line
#error产生编译错误消息,编译停止
#error [messages]
#line强制指定新的行号和文件名,下一行的行号为指定的数值。本质是改变了__LINE__和__FILE__这两个宏。
#pragma
一般处理编译器特有的指令,不同编译器不兼容,不认识的指令直接忽略。导致可能同一个指令不同的编译器处理方式不同。
用法:#pragma parameter
在VC中有message指令,可以在编译时输出信息,gcc没有这个指令。
内存对齐
#pragma pack(n) 按照n字节对齐。n一般是2、4。VC可以8字节对齐,gcc不行。
对齐的起始地址是偶数。
#与##
#在define后使用的作用是将其后的内容转换成字符串。
##将其前后的符号拼成一个字符。