#include 使用双引号和尖括号时,头文件搜索路径有什么差别?
实现通常让双引号形式先搜索当前源文件相关目录,再按配置的 Include 路径查找;尖括号形式主要搜索系统或显式 Include 路径。精确顺序由编译器实现和参数决定,应通过预处理输出确认。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
实现通常让双引号形式先搜索当前源文件相关目录,再按配置的 Include 路径查找;尖括号形式主要搜索系统或显式 Include 路径。精确顺序由编译器实现和参数决定,应通过预处理输出确认。
成员始终按类中声明顺序初始化,而不是按构造函数初始化列表的排列顺序。若一个成员初始化依赖另一个尚未构造的成员,会读取未初始化状态;基类还会先于成员构造。
类若只由能正确管理资源的成员组成,应遵循 Rule of Zero;一旦自定义析构、拷贝构造或拷贝赋值,通常要审视三者;引入移动语义后还要审视移动构造和移动赋值,形成 Rule of Five。
按段回收只保留从链接根可达的 Section,LTO 还会跨翻译单元分析。仅靠自定义段或看似未引用的注册对象可能被删除,需要在链接脚本用 KEEP、建立显式引用,并理解 used/retain 属性的工具链语义。
Placement New 只在调用者提供的已对齐存储上开始对象生命周期,不负责分配;对象使用结束后需显式析构,再由对象池归还原始存储。池必须保证大小、对齐、并发和重复释放安全。
读懂指针限定符,并理解 const 表达的是接口约束而不是物理只读保证。