编译器和数据类型=>;c作为参考

编译器和数据类型=>;c作为参考,c,gcc,compiler-construction,C,Gcc,Compiler Construction,在这篇文章中,我积累了三个不同的问题,但背景相似。以下是相同的 源->可执行文件的步骤顺序 编译器的32/64位版本 c数据类型大小对编译器的依赖性 Q1:源->可执行文件的步骤顺序 我假定以下是从源文件生成可执行文件的步骤 编写的源文件使用任何高级/中级语言编写,并由编译器进行预处理 当我们使用GCC/G++时,然后GCC-save temps-c生成一个.S和一个.O文件,这两个文件分别是程序集(可读)和目标代码(非人类可读) 最后一个阶段是将此目标代码链接以解析未知符号,从而创建机器(或

在这篇文章中,我积累了三个不同的问题,但背景相似。以下是相同的

  • 源->可执行文件的步骤顺序
  • 编译器的32/64位版本
  • c数据类型大小对编译器的依赖性
  • Q1:源->可执行文件的步骤顺序 我假定以下是从源文件生成可执行文件的步骤

    • 编写的源文件使用任何高级/中级语言编写,并由编译器进行预处理
    • 当我们使用GCC/G++时,然后GCC-save temps-c生成一个.S和一个.O文件,这两个文件分别是程序集(可读)和目标代码(非人类可读)
    • 最后一个阶段是将此目标代码链接以解析未知符号,从而创建机器(或)可执行代码
    所以这里的问题是这些假设正确吗?我经常看到术语对象和机器代码互换使用。这两者的确切区别是什么

    问题2:编译器的32/64位版本 在Q1的上述步骤中,编译器类型的影响到底在哪里。是生成的汇编代码被更改了吗

    问题3:c数据类型大小对编译器的依赖性 就c语言编程而言,数据类型的大小取决于编译器类型(或)硬件类型。请详细说明这些因素的相关性。虽然我在stack overflow中看到了与Q3的一些讨论,但我仍然对此感到困惑。

    Q1

    差不多是这样,但可能没有装配阶段。“预处理”是一个很好的小词,意思太多了

    对象代码和机器代码通常几乎相同。目标代码可能包含机器代码或某些可解释代码,而不是机器代码。目标代码通常不是执行的最终代码,需要链接器进一步处理。包含机器代码的可执行文件通常需要一些类似于链接器的处理,但这部分是由操作系统完成的。我们希望可执行文件能够重新定位,也就是说,能够在内存中的任何位置加载它们,以便在那里运行它们。重新定位涉及在加载可执行文件后但在执行之前在其内部修复地址。在运行时链接到DLL是操作系统执行的另一个类似链接器的功能

    Q2

    “预处理”是开始显示类型及其大小的第一步。编译器必须执行类型检查、类型转换和代码/数据生成。在所有这些步骤中,类型都不能被忽略。0xFFFF是
    int
    还是
    无符号int
    ?编译器应该为指针保留多少内存?一个100个
    双精度
    的数组应该分配多少空间?编译器如何将
    chars
    提升到
    ints
    ?那么代码优化呢?所有这些问题的答案都需要知道字体大小。当然,生成的程序集或机器代码将依赖于它们

    Q3


    理论上,类型大小取决于编译器。实际上,为了避免对目标硬件不直接支持的类型进行不必要的模拟,您拥有的类型直接对应于硬件支持的类型。C在其起源和本质上几乎是一个可移植的汇编程序,这应该可以解释它的许多“奇怪之处”(太原始了,让你很容易就开枪自杀,有许多未定义的和特定于实现的行为等等)。

    在意义上“预处理”是如何过载的?C标准严格定义了预处理器的作用以及何时完成。显然,“预处理源”是预处理器的输出。。。(
    gcc-E
    cpp
    )@rubenvb OP有效地将所有编译隐藏在“预处理”一词后面。我就是这样理解他的话的。因此这个词的意思太多了。