【C++基础部分】简单讲解一下C++程序的编译过程?static关键字在C++程序编译过程的哪个阶段起作用?

本问题对应文章链接:C++常见面试题整理

共以下 2 个回答

  • Thaddeus 永久会员 2023年9月17日 上午10:42
    一、C++编译过程(gcc举例)

    源文件:test.c

    1.预处理:预处理器处理源代码,对源代码进行宏替换、头文件展开、去除注释、条件编译等操作。

    gcc test.c -E -o test.i:使用-E选项对源文件test.c进行预处理,-o指定生成预处理后的文件test.i

    2.编译:编译器将预处理后的源代码翻译成汇编代码,同时进行语法检查和语义分析。

    gcc test.c -S -o test.s:使用-S选项对汇编文件test.i进行编译,-o指定生成汇编文件test.s

    3.汇编:汇编器将汇编代码转换为机器码,生成二进制形式的目标文件。

    gcc test.s -c -o test.o:使用-c选项对汇编文件test.s进行汇编,生成二进制文件test.o

    4.链接:把各个目标文件和程序所使用到的库文件合并,最终生成一个可执行文件,其中包含了所有代码的机器码。

    gcc test.o -o test

    二、static关键字在C++程序编译过程的哪个阶段起作用?

    答:编译和链接阶段

    编译阶段:static关键字会控制变量、函数和类成员的作用域和生命周期

    链接阶段:static关键字会控制符号的可见性,从而影响编译器将哪些符号包含在可执行文件中。

    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年7月7日 下午10:56

    C/C++是编译型高级语言,程序要执行,必须要有编译器和链接器。编译的过程主要分为四步:预处理、编译、汇编、链接。最后将源文件转换为机器可执行的代码。每个过程所做的工作:

    1. 预处理:在这个阶段,编译器会处理以#开头的预处理指令,比如#include包含头文件,#define定义宏等。这些指令会在源代码中进行替换和展开,同时会处理一些注释。
    2. 编译:在编译阶段,编译器会将预处理后的源代码翻译成中间代码,通常是汇编代码形式。这个步骤主要是对源代码进行词法分析、语法分析、语义分析和优化等操作。
    3. 汇编:在这一阶段,汇编器将中间代码转换为机器代码,生成目标文件。目标文件是二进制格式的文件,其中包含了可以被计算机直接执行的指令。
    4. 链接:最后一步是将目标文件与其他目标文件或库文件进行链接,生成最终的可执行文件。链接器会解析程序中的符号引用,解决函数和变量之间的引用关系,并将它们关联到正确的地址上。链接主要分为动态链接和静态链接。(静态链接:在编译时将需要的库文件和对象文件链接到可执行文件中,生成一个完全独立的文件。会增加可执行文件的大小。动态链接:在程序运行或加载时才将需要的库文件链接。但是程序的执行比较依赖于系统是否有那些库文件。)

    ​ 在C++程序的编译过程中,static关键字起作用的阶段包括两个阶段:编译阶段和链接阶段。
    ​ 在编译阶段,当我们使用static关键字修饰全局变量、函数或者类的成员变量时,它的作用是将这些符号的链接属性设置为内部链接,使得它们只对当前编译单元可见,其他编译单元无法访问。这意味着这些符号的生命周期仅限于当前的编译单元。
    ​ 在链接阶段,当多个编译单元被链接成一个可执行文件时,静态变量、函数或者类的成员变量是不会被链接到其他编译单元中的。它们只在声明它们的编译单元中存在,并且不能被其他编译单元直接引用。

    0 赞同 0 条回复

# 回答此问题

后才能回答