研究一个开源算法库,采用C++模板编程,所有函数实现都放在了头文件中,现在把模板去掉,链接时发生冲突,具体原因如下:
因为多个源文件包含了含有函数定义的头文件,在编译的时候,每个源文件都会包含一份函数定义,在链接时编译器不知道需要连接哪一份函数定义。
解决方法有三个:
- inline关键字
可以用关键字inline修饰函数定义,例如:
inline int add(int x, int y)
{
return x + y;
}
使用inline关键字,编译器会在调用此函数的地方把函数的目标代码直接插入,像宏一样被就地展开了。
另外使用inline关键字会有两个缺点:代码的体积变大了;inline不算C语言的关键字,以后代码移植可能会出现问题。
- static关键字
可以用关键字static修饰函数定义,例如:
static int add(int x, int y){ return x + y; }
使用static关键字,所有包含此头文件的源文件中都会存在此函数的一份副本,代码也有一定程度的膨胀,但好就好在互相不冲突,因为 static 关键字保证了该函数的可见度为单个源文件之内。
- 通过类的成员函数实现
实现方式如下:
#define Add(i,j) Math_Add::add(i,j)
class Math_Add
{
public:
static int add(int x, int y)
{
return x + y;
}
}
在使用的时候,调用Add(i, j)即可实现。
以上是三种把函数实现放在头文件中的方法,但是最好还是不要这样做,还是将函数声明和实现分开比较好。
参考文章:http://blog.csdn.net/freeboy1015/article/details/8075849
原文链接: https://www.cnblogs.com/xuhui24/p/6346692.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/248401
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!