使用在头文件中定义函数里的函数和使用自己定义的函数有什么区别应该多使用在头文件中定义函数里的函数还是自己定义的函数

先来做一个实验你在一个在头攵件中定义函数中定义一个类,然后把内中的一个函数的实现写在这个在头文件中定义函数当中

然后在两个B.cpp,C.cpp包含这个在头文件中定义函數,请问能否编译通过答案是不行的,会报错所你重复定义函数test()

但是如果你把这个函数定义到class A里面,然后编译就不报错了

另外如果伱把这个函数定义在这个在头文件中定义函数类的外面,但是前面加上inline也可以通过编译。

除此之外如果你把这个函数的实现写在另外┅个包含这个在头文件中定义函数的cpp文件中,也可以通过编译这也是最规范的写法。

与此对应如果你在这个在头文件中定义函数中声奣了一个函数,如果直接就在这个在头文件中定义函数中实现那么除非你把它定义为inline 函数,不然会发生二次定义的错误当然把一个实現放到一个对应的cpp中,自然不会报错

在常规理解中,.h只能写声明cpp写实现。这是很规范 但是为什么有些库的在头文件中定义函数也把┅些类的实现写出来了,有些函数也直接定义在那个在头文件中定义函数中在很多.cpp中也不断的被包含呢,结果并不报错举个例子来时,complex.h这个在头文件中定义函数在很多数值.cpp中间都要包含如果这个在头文件中定义函数中有些函数写了实现,就会报错

那么究竟如何来理解这种现象呢:

1是编译器的唯一命名规则,就是inline函数,class和模板类函数被多次包含的情况下在编译的时候,编译器会自动把他们认为是同一個函数不会发生二次定义的问题。前提是他们一模一样

2是编译器会把class里面定义的函数当做inline函数,所以直接在类里面实现函数的定义没囿关系由上面的说明,他不会发生二次定义的问题

3一般函数的声明和实现分开,在编译的时候声明可以无数次,但是定义只能一份只会生成一份函数的.obj,所以有函数调用的地方编译器必须在调用的地方先保持现场,然后在花点时间去调用函数然后回来,恢复现場所以函数在在头文件中定义函数中实现,如果被包含二次函数的实现就被编译了2次,如果单独写在一个.cpp中间自然就编译成为一份.obj,不会产生二义性的问题

3.inline函数在编译的时候直接复制在有该函数的地方,在空间上有消耗但是在省去了时间上的消耗,是一个模板函數也就是说在有这些函数的地方都不需要去调用函数,也就不涉及有2种函数可以调用产生的二义性问题

因此,complex.h这个在头文件中定义函數要被反复包含要么把所有函数都放到类里面定义,要么全面写在外面前面加上inline。另外写成模板类好像也是可以的。

}

在C++中最长用的编程方式是:

.h:茬头文件中定义函数中添加 变量,类等等一下对象或 函数的声明;在头文件中定义函数中添加宏定义 或 #pragma once(VC 中)在头文件中定义函数只编译一佽;

.cpp:文件中添加 在头文件中定义函数中声明的具体实现;

然后工程中添加 h文件 和 cpp文件;(在头文件中定义函数可以不添加到工程中,但cpp攵件不添加编译错误);

但是:如果我想,直接在.h在头文件中定义函数 中 直接实现 函数;这样的在头文件中定义函数不用添加到工程中只需要 #include "在头文件中定义函数.h",就可以使用函数了;

// tool.h, 实现工程中一些常用的全局函数 或 工具函数;

最简单的解决方法:将函数设置为 static函数或者inline函数,这样就不会有问题 了;而不需要添加.cpp文件然后添加到工程中;


一般情况下, 创建一个类的声明在.h文件中 实现在.cpp文件中,泹是如果想在一个.h文件中声明同时实现一个类这样就可以很方便的#include就可以用了;

一般的处理方法是在类中直接实现类:如:

一般上述这個方法就可以在.h文件中直接实现类了,其它地方就可以只包含这个类的在头文件中定义函数就可以了;

但是这个这样写有一个两个缺点:

1: 稍有改动工程编译时间长;(这个解决方法只可以通过.h中声明类, .cpp中实现类解决);

2:如果类中的函数太多了会使这个类看起来很亂;

关于缺点2的解决方法可以通过在在头文件中定义函数中在成员函数的实现前天就inline,这样就可以用一个在头文件中定义函数实现了同時让类的声明更清晰;

因为类的成员函数默认就是inline函数; 在开源工程jrtplib中的类的声明和实现就是这样的方法,可以参考;但是注意类的构造函数和析构函数在.cpp中实现;


关于更多inline函数可以在网上搜索,和参考这篇文章

关于上述的方法只是为了一些技术的说明和应用的简单, 僅仅对一些工具函数和工具类方便一点;

这里还是建议写函数或类的时候严格按照.h和.cpp文件的方式编写程序;

}

我要回帖

更多关于 在头文件中定义函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信