美文网首页
c语言-预处理

c语言-预处理

作者: gcrisis | 来源:发表于2019-03-21 13:24 被阅读0次

编译过程

-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后使用的作用是将其后的内容转换成字符串。

##将其前后的符号拼成一个字符。

相关文章

网友评论

      本文标题:c语言-预处理

      本文链接:https://www.haomeiwen.com/subject/bhuqvqtx.html