内联函数重定义链接错误

时间:2015-05-13 10:06:10

标签: c++

我在dll中导出了一个类。并在导出的类中获得内联函数:

Header.h

class MODULE_EXPORT A
{
 public:
    int GetInt(){ return iSomeInt; }
};

当我将该头文件包含在单独的模块中时。我收到错误LNK2005,这意味着:GetInt()已经定义。

如果我将函数定义放在.cpp文件中。没有错误发生。

如果我在头文件中以这种方式定义它,那么GetInt是内联函数,对吗?那么为什么重新定义链接错误呢?我使用vc ++编译器。 (Visual Studio 2010)。

编辑:

#pragma  once 

已添加到头文件中。忘记提及。

2 个答案:

答案 0 :(得分:0)

对于每个编译单元,头文件中的函数定义基本上是可见的,并且它们会尝试编译它。

但是该函数已在dll中定义。

解决方案是将定义放在cpp文件中,或者使用static关键字,这样定义只对其定义的编译单元可见,而不是包含它的那些。

同样内联函数只是编译器的性能提示,它可能不会内联它。对于这个函数,我无法想象它们是否具有任何性能优势,因为它简单,所以我建议将它移动到.cpp文件中。

答案 1 :(得分:0)

这是一个经典的C / C ++初学者问题:当你在多个地方包含.h时,你会得到同一方法的多个实例。解决此问题的最直观,最正确的方法是在.cpp文件中使用该方法。无论如何,你的编译器可能会内联它。

首先,由于您确实要将其设为内联,因此请在方法上使用inline关键字。

然后,使用正确的包含警卫(在.h文件的开头查找#pragma once#ifndef __FILE_NAME_H__或类似内容)。

然后,您的方法的定义是它的声明,并且应该以{{1​​}}结束。

另请注意,您的方法不会修改您的课程,因此您应该使用;关键字:

const

的.cpp

#ifndef __Header_h__
#define __Header_h__
class MODULE_EXPORT A {
  private:
    int internalint; 
  public:
    int getInt() const;
};
#endif