C基础

c程序编译过程

1、在编译环境下运行.c文件首先进入预编译

2、预编译具体做的事情

  • 字符替换,比如#define PI 3.14,将程序里面的PI都替换成3.14

  • 处理所有条件编译指令#ifdef #ifndef #endif等

  • 处理#include,把头文件都插进来

  • 删除所有注释

  • 添加行号和文件表示,以便出错时定位信息

  • 保留#pragma(设定编译器的状态或者是指示编译器完成一些特定的动作)

3、编译,把高级语言编程机器语言

4、连接,编译过的机器语言不能直接执行,必须要吧翻译成的二进制绑定需要用到的库,才能被执行

缺点:编译后要指定的机器才能使用,不便于夸机器夸平台使用

编译执行:直接把C程序语言编译成可执行文件

解释执行:当用到的时候再编译成可执行文件

关于‘为什么程序代码被编译成机器码就不能跨平台运行’看到个挺通俗的解释

作者:invalid s

链接:https://www.zhihu.com/question/38199129/answer/79525121

来源:知乎

假设你去西班牙旅游,肚子饿了;但你不会当地语言——就好像程序员想让CPU做什么,但他并不会二进制指令一样。

于是,你掏钱请来一名懂汉语的翻译,告诉他,你想要一份开封菜(KFC);他自然会把你的话翻译成西班牙语,帮你完成点餐大业——这名翻译官,我们就叫他“编译器”。

你很聪明,不打算下次继续掏钱给翻译。所以你用手机把翻译点餐时的对话录了下来;于是你再想吃饭,就只需要拿出手机重放一下就搞定了——我们把这个叫“可执行程序”。

然后,你去了埃塞俄比亚。当肚子饿时,你又摸出了手机。很遗憾,当地人也听不懂西班牙语——这就叫CPU指令不兼容。

于是,你只好重新雇佣翻译,要求点一份开封菜。
然而,听到翻译官的转述,当地人还是一脸茫然。因为那里并没有开封菜馆——这就叫API不兼容,即操作系统B并不提供、或者至少不以相同的方式提供操作系统A提供的功能。

你只好先打听下当地有什么菜,然后从中选择一个比较可以接受的,同样完成了填肚子大业——这就叫“移植”(即利用另一个操作系统上提供的、和原始系统不同的其他接口,以不同的思路完成类似任务)。

当然,你同样鸡贼的录下了翻译的话。但第二天,你发现手机坏了;于是你重新买了一个,掏出坏手机上的老式大号SD卡,在新手机的micro SD插槽上比划了半天,发现根本不可能塞进去——这就是ABI不兼容:虽然包括电气规范、文件格式等等等等全都一样,但就是尺寸不对;你只能干瞪眼。

最后,你忍无可忍,咬咬牙雇了个通晓一百多种语言的高级翻译随行。
现在,随便你走到哪,都不愁说话没人懂了。就是……贵的令人心痛——这种做法就叫“解释执行”。

等你回国后,和好朋友小明说起这事,小明笑弯了腰,说你真是个土老帽。
原来,你去的那些地方,都不难遇到懂英语的。只要你提前把可能遇到的问题都翻译成英语,然后到当地找个懂英语的就行了——相当于把英语当作“中间语言”(java的字节码),而当地懂两句英语的就是java虚拟机(jvm):你只要找到“jvm”,多少掏俩钱,给他们看看写着英文的纸条,他们就会帮你把事办成。