本问题对应文章链接:C++常见面试题整理
源文件: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关键字会控制变量、函数和类成员的作用域和生命周期
static
链接阶段:static关键字会控制符号的可见性,从而影响编译器将哪些符号包含在可执行文件中。
C/C++是编译型高级语言,程序要执行,必须要有编译器和链接器。编译的过程主要分为四步:预处理、编译、汇编、链接。最后将源文件转换为机器可执行的代码。每个过程所做的工作:
#
#include
#define
在C++程序的编译过程中,static关键字起作用的阶段包括两个阶段:编译阶段和链接阶段。 在编译阶段,当我们使用static关键字修饰全局变量、函数或者类的成员变量时,它的作用是将这些符号的链接属性设置为内部链接,使得它们只对当前编译单元可见,其他编译单元无法访问。这意味着这些符号的生命周期仅限于当前的编译单元。 在链接阶段,当多个编译单元被链接成一个可执行文件时,静态变量、函数或者类的成员变量是不会被链接到其他编译单元中的。它们只在声明它们的编译单元中存在,并且不能被其他编译单元直接引用。
共以下 2 个回答
一、C++编译过程(gcc举例)
源文件:test.c1.预处理:预处理器处理源代码,对源代码进行宏替换、头文件展开、去除注释、条件编译等操作。
gcc test.c -E -o test.i:使用-E选项对源文件test.c进行预处理,-o指定生成预处理后的文件test.i2.编译:编译器将预处理后的源代码翻译成汇编代码,同时进行语法检查和语义分析。
gcc test.c -S -o test.s:使用-S选项对汇编文件test.i进行编译,-o指定生成汇编文件test.s3.汇编:汇编器将汇编代码转换为机器码,生成二进制形式的目标文件。
gcc test.s -c -o test.o:使用-c选项对汇编文件test.s进行汇编,生成二进制文件test.o4.链接:把各个目标文件和程序所使用到的库文件合并,最终生成一个可执行文件,其中包含了所有代码的机器码。
gcc test.o -o test二、static关键字在C++程序编译过程的哪个阶段起作用?
答:编译和链接阶段
编译阶段:
static关键字会控制变量、函数和类成员的作用域和生命周期链接阶段:
static关键字会控制符号的可见性,从而影响编译器将哪些符号包含在可执行文件中。C/C++是编译型高级语言,程序要执行,必须要有编译器和链接器。编译的过程主要分为四步:预处理、编译、汇编、链接。最后将源文件转换为机器可执行的代码。每个过程所做的工作:
#开头的预处理指令,比如#include包含头文件,#define定义宏等。这些指令会在源代码中进行替换和展开,同时会处理一些注释。 在C++程序的编译过程中,static关键字起作用的阶段包括两个阶段:编译阶段和链接阶段。
在编译阶段,当我们使用static关键字修饰全局变量、函数或者类的成员变量时,它的作用是将这些符号的链接属性设置为内部链接,使得它们只对当前编译单元可见,其他编译单元无法访问。这意味着这些符号的生命周期仅限于当前的编译单元。
在链接阶段,当多个编译单元被链接成一个可执行文件时,静态变量、函数或者类的成员变量是不会被链接到其他编译单元中的。它们只在声明它们的编译单元中存在,并且不能被其他编译单元直接引用。