将函数实现放在头文件中

Posted xuhui24

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将函数实现放在头文件中相关的知识,希望对你有一定的参考价值。

  研究一个开源算法库,采用C++模板编程,所有函数实现都放在了头文件中,现在把模板去掉,链接时发生冲突,具体原因如下:

  因为多个源文件包含了含有函数定义的头文件,在编译的时候,每个源文件都会包含一份函数定义,在链接时编译器不知道需要连接哪一份函数定义。

解决方法有三个:

1. inline关键字

  可以用关键字inline修饰函数定义,例如:

inline int add(int x, int y)
{
   return x + y;  
}

使用inline关键字,编译器会在调用此函数的地方把函数的目标代码直接插入,像宏一样被就地展开了。

另外使用inline关键字会有两个缺点:代码的体积变大了;inline不算C语言的关键字,以后代码移植可能会出现问题。

2. static关键字

  可以用关键字static修饰函数定义,例如:

static int add(int x, int y)
{
  return x + y;
}

使用static关键字,所有包含此头文件的源文件中都会存在此函数的一份副本,代码也有一定程度的膨胀,但好就好在互相不冲突,因为 static 关键字保证了该函数的可见度为单个源文件之内。

3. 通过类的成员函数实现

  实现方式如下:

#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

以上是关于将函数实现放在头文件中的主要内容,如果未能解决你的问题,请参考以下文章

何时将静态函数定义放在 C 的头文件中?

函数实现不放在头文件的原因,及何时可以放头文件的情况

Swoole 关于reload重启与回调函数中代码的重载

《深度学习入门 基于Python的理论与实现》书中代码笔记

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

统计c程序中代码行数以及函数的个数