C++ 编译与链接面试题
1. C++程序的编译过程是什么?
答案:
- 四个阶段预处理(Preprocessing)处理#include、#define等指令展开宏条件编译生成.i文件编译(Compilation)将预处理后的代码转换为汇编代码语法检查、语义分析优化生成.s文件汇编(Assembly)将汇编代码转换为机器码生成目标文件.o或.obj链接(Linking)将多个目标文件链接成可执行文件解析符号引用重定位生成可执行文件
- 命令示例
# 预处理 g++ -E main.cpp -o main.i # 编译 g++ -S main.cpp -o main.s # 汇编 g++ -c main.cpp -o main.o # 链接 g++ main.o -o main
C++面试题合集 : https://www.nowcoder.com/creation/manager/columnDetail/MJ4oG8
2. 什么是头文件?为什么需要头文件保护?
答案:
- 头文件作用声明函数、类、变量提供接口代码复用
- 头文件保护防止重复包含避免重定义错误
- 传统方法(Include Guard)
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
// ...
};
#endif
- 现代方法(#pragma once)
#pragma once
class MyClass {
// ...
};
- 对比pragma once更简洁Include Guard更标准现代编译器都支持#pragma once
3. 什么是链接?静态链接和动态链接的区别?
答案:
- 链接定义将多个目标文件组合成可执行文件解析符号引用分配内存地址
- 静态链接编译时将库代码复制到可执行文件生成独立的可执行文件文件大,但不依赖外部库Windows: .lib, Linux: .a
- 动态链接运行时加载库多个程序共享同一库文件小,节省内存需要库文件存在Windows: .dll, Linux: .so
- 对比
# 静态链接 g++ main.cpp -static -o main # 动态链接(默认) g++ main.cpp -o main
- 优缺点静态:独立、快速启动,但文件大动态:节省空间、易更新,但依赖外部库
4. 什么是符号?extern关键字的作用?
答案:
- 符号定义函数名、变量名等标识符链接器通过符号解析引用
- extern关键字声明外部符号不分配内存告诉编译器符号在其他文件定义
- 使用示例
// file1.cpp
int globalVar = 10;
void func() {
// ...
}
// file2.cpp
extern int globalVar; // 声明
extern void func(); // 声明
void use() {
cout << globalVar;
func();
}
- extern "C"使用C链接方式避免C++名称修饰用于C/C++混合编程
extern "C" {
void c_function();
}
5. 什么是名称修饰(Name Mangling)?
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.