1

我现在正在构建一个 C++ DLL 库。今天我遇到了一个令人困惑的问题:在这个库中我可以定义类但不能定义函数。更具体地说,我给出以下代码来说明我的问题:

namespace fundamental
{

    class Tree
    {
    public:
        Tree() {};
        ~Tree() {};
        int x;
    };

     /*int anyfunction()
    {
        return 1;
    }*/

}

上面的定义在头文件中,这个文件会被其他文件调用。我的问题是,如果我注释了函数部分(int anyfunction())一切都很好,但是如果我添加了这个函数,我会得到以下错误:

page_analysis.obj : error LNK2005: "int __cdecl fundamental::anyfunction(void)" (?anyfunction@fundamental@@YAHXZ) already defined in geo_box.obj
1>pa_region_properties.obj : error LNK2005: "int __cdecl fundamental::anyfunction(void)" (?anyfunction@fundamental@@YAHXZ) already defined in geo_box.obj

我的问题是为什么我只会为函数而不是类得到 LNK2005 错误。有任何想法吗?

4

2 回答 2

3

如果您在头文件中定义某些内容,则该定义将在包含该头文件的任何翻译单元(粗略地说,每个源文件)中重复。有时,多个定义是错误的。

类可以在多个翻译单元中定义,只要定义相同即可;事实上,它们必须在任何使用它们的翻译单元中定义。

函数通常不能,但您可以通过声明它来允许它inline

inline int anyfunction() {return 1;}

或者您可以将定义移动到单个源文件中,并且只在标题中声明它:

// header
namespace fundamental {
    int anyfunction();
}

// source file
int fundamental::anyfunction() {return 1;}
于 2012-07-12T16:30:06.520 回答
2

您很可能已通过标头将该功能包含到不同的翻译单元(又名 cpp 文件)中。如果您确实需要内联该函数,请使用“内联”:

inline int anyfunction()
{
    return 1;
}

HTH 托斯滕

于 2012-07-12T16:22:43.277 回答