C++头文件有关内容(不断更新)

来源:互联网 发布:快速排序java实现 编辑:程序博客网 时间:2024/06/06 20:12

其实头文件与源文件并无本质区别,只不过文件扩展名不同,且头文件无法编译。#include就是将文件扩展到源文件内容中。头文件主要实现接口的功能,而函数功能的实现由其他源文件完成。

 (1)名字在使用之前要先声明或定义,如果编写一个大型程序,想使用其他文件定义的函数,那需要能让编译器能够找到那个函数,常用的方法是定义源文件的头文件,在头文件中声明(推荐方式)。还有就是可以直接包含该文件(虽然不知道为什么错误,但是还是尽量遵从好的编程习惯)

错误的方式,源文件直接包含另一源文件,当然这是不建议的方式。

常用的方式,通过创建头文件引用其他文件中的函数。

头文件定义

而头文件中函数的定义在putout.cpp中,运行结果显示E:\C++练习\头文件有关练习\useheader.o:useheader.cpp|| undefined reference to `putout(int, int)'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

说明没有找到putout.cpp中函数的定义。那头文件是如何找到函数定义的呢?

通过查资料得知以下内容:

编译器的处理过程包括预处理、编译、链接、生成可执行文件。

#include预处理命令属于预处理过程,进行文本替换。

编译过程中,生成目标文件。头文件中的函数声明只保证了编译不会出错,例如头文件中声明某个函数,源文件使用该函数,可是编译过程并不能找到该函数的实现,将函数或变量视为一个个的符号,找到函数实现的任务落在下一过程。

链接过程负责处理程序中的一个个的符号,使之变得有真实意义,该过程会去其他目标文件中查找函数的实现,调用函数。最后形成一个可执行程序。

在这里所面临的问题是,无法使编译器找到实现函数文件生成的目标文件。查到的解决方法有两个,第一将多个源文件组建为项目(project),IDE就会自动找到函数实现源文件,或者将源文件生成库文件。第二是通过使用makefile的方式。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。(引自百度百科)

头文件可以出现的内容包括类定义,由常量表达式初始化的const变量,inline函数定义,变量的声明,函数的声明。

为什么不能再头文件中定义函数及变量参见http://blog.csdn.net/fushiqianxun/article/details/7961552

为什么头文件中可以出现类定义?

头文件中保护符的出现可以保证类不会重复定义。

为什么头文件中可以出现由常量表达式初始化的const变量?

在头文件中定义const变量的原因使多个文件使用相同的常量值。const变量默认为定义该变量文件的局部变量,所以不会出现重复定义的问题。为了使各个文件中的使用相同的常量值,所以使用常量表达式初始化而不是变量。(为什么不使用变量呢,你要用也没人拦着你,不过变量在运行阶段才能确定值,而且需要去其他源文件中查找变量的值到底是多少,而且很不安全,如果变量值改变,那常量值是不是也改变了,需要重新编译,还不如直接在头文件中声明变量呢)

为什么可以头文件中可以出现inline函数定义?

inline函数声明适用于那些代码量较少,但是使用频率较多的函数。普通函数的放在代码区,由系统分配代码入口地址,当需要调用函数时,就将程序控制权交给普通函数,执行完后将返回值返回给调用函数者。这样一来一回很耗费时间。而内联函数(inline函数)的使用方法为将它在程序中的每个调用点“内联地”展开。可以简单地理解为将代码展开。这样一来没有改变程序的控制权,程序执行的时间大大减少。将内联函数定义放在头文件中,这样编译器才知道如何展开内联函数。

0 0
原创粉丝点击