#include 使用双引号和尖括号时,头文件搜索路径有什么差别?
实现通常让双引号形式先搜索当前源文件相关目录,再按配置的 Include 路径查找;尖括号形式主要搜索系统或显式 Include 路径。精确顺序由编译器实现和参数决定,应通过预处理输出确认。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
实现通常让双引号形式先搜索当前源文件相关目录,再按配置的 Include 路径查找;尖括号形式主要搜索系统或显式 Include 路径。精确顺序由编译器实现和参数决定,应通过预处理输出确认。
类若只由能正确管理资源的成员组成,应遵循 Rule of Zero;一旦自定义析构、拷贝构造或拷贝赋值,通常要审视三者;引入移动语义后还要审视移动构造和移动赋值,形成 Rule of Five。
Placement New 只在调用者提供的已对齐存储上开始对象生命周期,不负责分配;对象使用结束后需显式析构,再由对象池归还原始存储。池必须保证大小、对齐、并发和重复释放安全。
malloc 分配未初始化存储,calloc 按元素计数并置零但仍要防乘法溢出;realloc 可能原地扩展、搬迁或失败,失败时原指针仍有效。应用应先接收临时返回值,再更新所有权。
sizeof 数组对象得到整个数组字节数,strlen 沿字符序列查找到首个 `\0`,不包含终止符;数组作为大多数表达式或函数参数时会转换为首元素指针,此时 sizeof 得到指针大小。
strcpy 不知道目标容量;strncpy 在源过长时不保证终止且会填充剩余空间;snprintf 接收容量并返回所需长度,更适合格式化,但仍要检查截断和返回错误。接口最好同时携带指针与容量。
strtok 会修改输入字符串并通过内部状态记住下一位置,多线程、嵌套解析或中断重入会互相覆盖状态。可使用 strtok_r、显式游标解析,或对不允许修改的数据使用长度切片。
#define 在预处理阶段做 Token 替换,没有类型语义;typedef 在编译阶段为已有类型定义别名,遵守作用域和声明语法。尤其声明多个指针或叠加 const 时,两者展开结果可能完全不同。