想要搞明白这个问题,大家先得了解一下源代码是怎么变成程序的。
四个过程:预处理——编译——汇编——可执行文件
当大家编写完代码后,源代码会经过上述的四个环节,最终变成常见的可执行文件。
预处理阶段(hello.i):在源代码中会有头文件,一些宏,注释等。预处理的目的就是将头文件展开,宏文件代换,去掉注释等,对代码进行一些初步的处理
编译阶段(hello.s):这一阶段主要是检查语法上的错误,比如内存有没有溢出,指针有没有指错对象,然后生成可汇编文件。
汇编阶段(hello.o):计算机是不认识代码的,所以需要将汇编代码转换成0和1组成的机器码
链接(a.out):链接有两种情况:静态和动态。静态库和应用程序编译在一起,在任何情况下都能运行;而动态库是动态链接,文件生效时才会调用。最终生成一个可执行文件。
编译器的作用
大家不要把编译器想的太厉害,觉得编译器是万能的。实际上编译器就像是一个翻译,负责把高级语言转变成机器能看懂的低级语言,翻译过程就是上述的四个过程。但是其中有一点需要格外注意。那就是不同的公司使用的指令集不同。输出程序的格式和CPU使用的指令集有关,比如X86,arm,还有MIPS等等,由于设计思路的差异,所以不同平台上编译生成后的可执行文件格式是不一样的,可能在ubantu里能运行的C程序,放到windows下就会报错。
类比一下java,为什么说java可以跨平台,是因为java内置了一个虚拟机,程序都从虚拟机中跑的,所以有人说“java不仅是一种语言,更是一个平台”。
综上所述,C/C++的一些基础性代码是可以跨平台的(可能会受API影响),是生成的可执行文件不能跨平台,C/C++不自带编译器,不同平台下的编译器存在差异。
(都看到最后了,麻烦点个赞和关注吧,谢谢~)