当先锋百科网

首页 1 2 3 4 5 6 7

首先我们纠正一下题目中一个小小的误区,不是C和C++不能跨平台,应该是说是C/C++源代码在编译后生成的

.exe

文件不能跨平台,源代码和可执行文件要区分开来。

想要搞明白这个问题,我们先得了解一下源代码是怎么变成程序的。

四个过程:预处理——编译——汇编——可执行文件

当我们编写完代码后,源代码会经过上述的四个环节,最终变成常见的可执行文件。

  1. 预处理阶段(hello.i):在源代码中会有头文件,一些宏,注释等。预处理的目的就是将头文件展开,宏文件代换,去掉注释等,对代码进行一些初步的处理

  2. 编译阶段(hello.s):这一阶段主要是检查语法上的错误,比如内存有没有溢出,指针有没有指错对象,然后生成可汇编文件。

  3. 汇编阶段(hello.o):计算机是不认识代码的,所以需要将汇编代码转换成0和1组成的机器码

  4. 链接(a.out):链接有两种情况:静态和动态。静态库和应用程序编译在一起,在任何情况下都能运行;而动态库是动态链接,文件生效时才会调用。最终生成一个可执行文件。

编译器的作用

我们不要把编译器想的太厉害,觉得编译器是万能的。实际上编译器就像是一个翻译,负责把高级语言转变成机器能看懂的低级语言,翻译过程就是上述的四个过程。但是其中有一点需要格外注意。那就是不同的公司使用的指令集不同。输出程序的格式和CPU使用的指令集有关,比如X86,arm,还有MIPS等等,由于设计思路的差异,所以不同平台上编译生成后的可执行文件格式是不一样的,可能在ubantu里能运行的C程序,放到windows下就会报错。

类比一下java,为什么说java可以跨平台,是因为java内置了一个虚拟机,程序都从虚拟机中跑的,所以有人说“java不仅是一种语言,更是一个平台”。


综上所述,C/C++的一些基础性代码是可以跨平台的(可能会受API影响),是生成的可执行文件不能跨平台,C/C++不自带编译器,不同平台下的编译器存在差异。

(都看到最后了,麻烦点个赞和关注吧,谢谢~)