c++ 头文件相互包含导致编译问题
根本原因是用到某个符号的时候符号还没声明,找不到符号导致编译报错
方法是make .. verbose=1,展示所有预处理,编译等详细过程
然后使用 gcc -E ,查看文件包含展开的情况
gcc -E circle.c -o circle.i
C语言代码在交给编译器之前,会先由预处理器进行一些文本替换方面的操作,例如宏展开、文件包含、删除部分代码等。
在正常的情况下,GCC 不会保留预处理阶段的输出文件,也即.i
文件。然而,可以利用-E
选项保留预处理器的输出文件,以用于诊断代码。-E
选项指示 GCC 在预处理完毕之后即可停止。
在生成的.i文件里查找符号S,发现S的声明地方在S的使用地之后,这也就导致了编译找不到符号报错.
举个例子
b.h
include a.h
原先编译b.h的时候,a.h中的符号已经声明过
现在a.h中增加
include b.h
这样在a.h编译时,会先展开b.h。而其右依赖a.h。但a.h这时还没到符号展开那步,岁报错
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2020-07-21 socket[可读\可写\异常]3种条件的发生