为什么main_c.c已包含<assert.h>,func.c仍需引入该头文件?
核心原因
C语言采用翻译单元独立编译机制,每个.c源文件是一个完全独立的编译单元,不同单元的头文件包含关系互不传递:
- 你在
main_c.c中引入的<assert.h>仅对main_c.c本身的编译生效,不会共享给其他.c文件 - 你的
func.c中直接使用了assert宏,而这个宏的定义仅存在于<assert.h>头文件中,编译func.c时编译器找不到该宏的定义,因此抛出缺少头文件的提示。
额外注意:你贴出的
func.c代码里把assert误写为asert,如果不是输入笔误请同步修正拼写,否则即使引入头文件也会报未定义错误。
修复方案
两种常用方案可选:
- 直接在
func.c头部添加#include <assert.h>,这是最推荐的做法:遵循「谁使用依赖谁显式引入」的原则,后续即便代码拆分移动也不会出现依赖缺失问题。 - 如果多个
.c文件都需要用到<assert.h>,可以把#include <assert.h>添加到公共头文件file.h中,所有引入了file.h的源文件都会自动继承该头文件,无需重复引入。
内容的提问来源于stack exchange,提问作者shaked maman
相关产品推荐
相关产品推荐

