关于include头文件的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于include头文件的问题相关的知识,希望对你有一定的参考价值。

编了一个单链表结构,共有4个文件。分别是:List.h,ListItr.h,AbsList.h和test.cpp,他们之间如何include?是不是Ainclude了B,B就不需要includeA了?我现在只能把他们全放在一个文件中,可以编译,说明程序没问题。但我想分成4个……否则没意义了。
还有我用的是模板函数,是不是一定要写在一个文件里?编译环境vs08。3个头文件均有互相调用对方的函数。
最后问一下,.h和.cpp有什么区别,好像写在哪里都能编译的样子……

参考技术A 在文件中写一行#include,在编译时,其效果与把被包含的文件的内容整个拷贝到这一行所在的位置是完全相同的,由此可知A include了B,B不仅不用再include A,而且绝对不能再include A,否则等于把源文件长度变得无限长,实际上编译时也会无法通过,因为编译器认为你对字段进行的重复定义。
h是头文件,cpp是执行代码文件,头文件中一般只做定义和声明,比如声明一个函数或类,却并不实际记录这个函数的代码,只是在编译时事先向编译器通告程序中会使用这样一个函数,当遇到这个字符串应该被解释成一个函数。这个函数的具体代码则由一个cpp文件实际的记录。本回答被提问者采纳

关于将函数写入头文件问题

如果某些函数在其他很多 cpp 文件中被调用,那么为了避免写大量重复的代码以及让代码量更小一些,我们可以将这些函数写头文件中,然后其他 cpp 文件只需要引用该头文件然后就可以使用包含在头文件中的函数了。

具体实现方法:

可以直接将函数的定义写入一个xxx.h文件中
然后用g++ xxx.h 命令将xxx.h编译一遍
然后在cpp源文件中用#include"xxx.h"引用即可

然而上面的方法是存在问题的,如果直接将函数的定义写入头文件中,那么这个头文件如果只同时被一个 cpp 文件引用是可行的,但如果其同时被多个 cpp 文件引用是不行的。因为引用头文件在预编译时直接就将头文件中的内容插入源程序。如果直接将函数定义写在头文件中,然后该头文件被多个 cpp 文件引用,则这些 cpp 文件编译生成的 obj 文件中都含有写在头文件中的函数的定义,所以这些 obj 文件在链接的时候会由于含有重复定义而报错(c++ 中允许变量和函数的申明出现多次,但变量和函数的定义只能出现一次)。

例如:

 1 //gel.h
 2 
 3 int max_(int a, int b){
 4     return a > b ? a : b;
 5 }
 6 
 7 //test1.cpp 
 8 
 9 #include "gel.h"
10 #include <iostream>
11 using namespace std;
12 
13 int main(void){
14     cout << max_(1, 2) << endl;
15     return 0;
16 }
17 
18 //test2.cpp
19 
20 #include <iostream>
21 #include "gel.h"
22 using namespace std;
23 
24 int main(void){
25     cout << max_(10, 2) << endl;
26     return 0;
27 }

 

解决的方法:

在头文件中只写声明,把定义写到另一个cpp文件中就好啦。。

引用另一个文件的内容除了以头文件的形式外也可以直接将函数写入一个cpp文件,然后在需要引用的地方加个声明,再链接一下就好啦。。。

事实上只要符合语法(主要是不重复定义变量,函数等),也可以将一个 cpp 文件通过头文件引入另一个 cpp 文件中。。。

通常是将函数的声明写入头文件,然后将函数体写到其他 cpp 文件中:

 1 // max.h
 2 int max_(int a, int b);
 3 int max_(int a, int b, int c);
 4 
 5 // a.cpp
 6 #include "max.h"
 7 
 8 int max_(int a, int b){
 9     return a > b ? a : b;
10 }
11 
12 // b.cpp
13 #include "max.h"
14 
15 int max_(int a, int b, int c){
16     return max_(a, b) > max_(b, c) ? max_(a, b) : max_(b, c);
17 }
18 
19 // c.cpp
20 #include <iostream>
21 #include "max.h"
22 using namespace std;
23 
24 int main(void){
25     int a, b, c;
26     cin >> a >> b >> c;
27     cout << max_(a, b) << endl;
28     cout << max_(a, b, c) << endl;
29     return 0;
30 }

 

以上是关于关于include头文件的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于include头文件的问题

我罗斯方块最终篇(Player类Game类)

c++关于multiset的头文件包含问题。

win32 关于#include“stdafx.h”详解(明白了预编译头文件)还有GetCurrentDirectory()介绍

关于在linux下用gcc编译头文件的问题。

关于将函数写入头文件问题