新手在学习C/C++的时候一般会对头文件的概念不太理解,不明白为什么要去写这个东西,今天就来说说这个东西。
一、为什么要使用头文件
首先我们可以把包含主函数的源文件想象成一个厨房,然后主函数就是厨师,头文件就像是各种食材的配方。
当我们的主函数厨师要制作一道复杂的菜肴时,比如法式红酒烩牛肉。制作这道菜需要用到红酒,牛肉,洋葱等食材,这就好比程序中要用到各种函数、然后这些食材的处理方式有专门的说明,比如要先把牛肉煎到两面金黄,再把红酒和特定香料混合.....,这些说明就写在头文件里面。厨师需要先查看这些配方说明才能正确处理食材,最终成功的做出这道菜。如果没有这些配方说明,主函数厨师可能就不知道怎么去处理这些食材不清楚做菜的步骤,于是就会把菜搞砸然后报错....
二、头文件的作用
1.提高代码的可读性 :
头文件就像是一本带有详细目录的书籍一样,例如:
在一个大型项目中有许多复杂的函数和类,如果没有头文件,当查看包含主函数的源文件时,会看到一对不明所以的函数和变量,但是有了头文件,编译器就能清楚地知道每一个函数或者类的大致用途,因为头文件中对这些函数或者变量进行了声明,这就好像通过目录快速了解书的内容结构一样,方便阅读代码和理解程序逻辑。
2.便于代码维护
假设要修改一个函数的参数类型或者返回值类型,如果所有的函数声明和定义都混在源文件里面,那么就需要在每一处调用这个函数的地方去检查和修改。但要是有了头文件,就只需要在头文件里面修改函数声明,然后确保对应的定义也正确的修改即可,这就好比厨房的食材和配方更新了,来调整烹饪步骤,而在整个烹饪过程中,其他步骤(其他源文件中的调用部分)也可以很方便的知道哪里发生了改变。
三、使用注意事项(新手看看就好)
1.避免循环包含
这就好比在一个复杂的家庭关系中,不能出现相互嵌套定义的情况,例如:
头文件A包含头文件B,同时头文件B又包含头文件A,那么这种情况就会让编译器陷入混乱,这种情况类似于一个人说:“我的身份由另一个人定义,而那个人的身份又由我定义”,然后编译器无法确定到底应该先处理谁的内容。
2.只进行声明而非定义(一般情况下)
头文件应该主要包含声明内容,就像菜谱只说明需要什么食材和大概步骤,而不是详细描述烹饪的每一个细节。如果在头文件中定义非内联函数。非静态变量等,当这个头文件被多个源文件包含时,就会出现重复定义的错误。例如:
一个函数的完整实现(包括函数体)就像是完整的烹饪了一道菜,如果在头文件中这样做,每个包含这个头文件的源文件都会重新烹饪这道菜,这一看就不合理。
3.包含路径的正确设置
这类似于你要找一本书,必须知道它是在图书馆的哪个书架上。如果包含路径设置错误,编译器就会无法找到头文件,在一些复杂的项目中,可能需要明确的告诉编译器头文件在哪里,特别是对于自定义的头文件。
总之头文件在C/C++中时非常重要的工具,它能够帮助我们更好的组织代码,让不同的源文件之间能够有效地写作,合理的使用头文件可以提高代码的可读性和可维护性,在使用头文件时,一定要注意避免重复包含,谨慎处理包含顺序,正确分离声明和定义,并且确保包含路径正确,这样才能让程序顺利的通过编译和运行。