我在dll中导出了一个类。并在导出的类中获得内联函数:
Header.h
class MODULE_EXPORT A
{
public:
int GetInt(){ return iSomeInt; }
};
当我将该头文件包含在单独的模块中时。我收到错误LNK2005,这意味着:GetInt()已经定义。
如果我将函数定义放在.cpp文件中。没有错误发生。
如果我在头文件中以这种方式定义它,那么GetInt是内联函数,对吗?那么为什么重新定义链接错误呢?我使用vc ++编译器。 (Visual Studio 2010)。
编辑:
#pragma once
已添加到头文件中。忘记提及。
答案 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