不一定需要在源文件(如 A.c)中再次包含已在其对应头文件(如 A.h)中包含的头文件(如 <stdio.h>),除非源文件自身直接使用了那个头文件中定义的功能。
基本原则
避免重复:如果 A.c 包含了 A.h,并且 A.h 已经包含了 <stdio.h>,则 A.c 中通常不需要再次包含 <stdio.h>,因为它通过 A.h 间接包含了该文件。
自足原则:每个文件(无论是头文件还是源文件)都应该包括它需要的所有头文件,以确保它的独立性。这意味着如果 A.c 中的代码直接使用了 <stdio.h> 的功能(比如 printf 或 FILE 类型),那么它应该明确包括 <stdio.h>。
实践建议
如果 A.h 中定义的函数或类型依赖于 <stdio.h> 中的声明(如使用 FILE * 类型的参数或返回值),那么 A.h 需要包含 <stdio.h>。
如果 A.c 中的代码直接调用了 <stdio.h> 提供的函数,如 printf,那么最好在 A.c 中也显式包含 <stdio.h>,即使通过 A.h 已经间接包含了它。这样做提高了代码的可读性和模块独立性。
结论
总的来说,包含策略应该保证每个文件都可以独立编译,并且清晰地表达了它的依赖关系。如果头文件中的定义对其他文件透明(即其他文件不需要知道这些定义的细节),则不必在源文件中重复包含这些头文件。但如果源文件中明确用到了某个头文件的内容,最好显式地包括它,即使已通过其他头文件间接包括。这样既保持了清晰的模块界限,也避免了在重构过程中可能删除或更改间接包含路径的风险。