我所理解的程序环境和预处理

程序的翻译环境和执行环境

翻译环境

首先一个源文件会通过编译器的编译过程形成目标文件,

其次每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行文件(.exe),

当然连接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

编译本身也有好几个阶段

 

  • 预编译阶段(*.i)(gcc -E)  预处理指令,比如#include头文件的包含,注释的删除,#define的符号替换等都是文本操作。
  • 编译(*.s)(gcc -S)把C语言转换为汇编语言 主要进行语法分析、词法分析、语义分析、符号汇总(全局变量)。
  • 汇编(生成可重定位目标文件*.o)主要是形成符号表,汇编指令->二进制指令----->test.o------>sum.o
  • 链接 主要是合并段表、符号表的合并和符号表重定位。                                                                                                

   其实总结一下,就是隔离编译,一起链接。

预处理

预定义符号

__FILE__     //进行编译的源文件

__LINE__    //文件当前的行号

__DATE__   //文件被编译的日期

__TIME__    //文件被编译的时间

__STDC__   //如果编译器遵循ANSI C,其值为1,否则未定义 。事实上,Linux是遵循的,但是vs不遵循。

#define 定义标识符

在预处理的时候就替换,后面不需要加“  否则可能出现问题。

如:

#define MAX 100;

if(condition)

    max = MAX;

else

    max = 0;

这会出现什么情况呢?

如果你把它放到vs里编译一下,那么它就会告诉你“没有匹配if的非法else” ,那是因为它在预处理替换时,会把MAX替换为100;这样if 后面就跟了两句话,而if 并没有加{},从而导致没有和if匹配的非法else。

未完。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值