Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio 2010中函数(而非类)的LNK 2005链接错误 我现在正在构建一个C++ DLL库。今天我遇到了一个令人困惑的问题:在这个库中,我可以定义类,但不能定义函数。更具体地说,我给出以下代码来说明我的问题: namespace fundamental { class Tree { public: Tree() {}; ~Tree() {}; int x; }; /*int anyfunction() { return 1; }*/ }_C++_Visual C++ - Fatal编程技术网

Visual Studio 2010中函数(而非类)的LNK 2005链接错误 我现在正在构建一个C++ DLL库。今天我遇到了一个令人困惑的问题:在这个库中,我可以定义类,但不能定义函数。更具体地说,我给出以下代码来说明我的问题: namespace fundamental { class Tree { public: Tree() {}; ~Tree() {}; int x; }; /*int anyfunction() { return 1; }*/ }

Visual Studio 2010中函数(而非类)的LNK 2005链接错误 我现在正在构建一个C++ DLL库。今天我遇到了一个令人困惑的问题:在这个库中,我可以定义类,但不能定义函数。更具体地说,我给出以下代码来说明我的问题: namespace fundamental { class Tree { public: Tree() {}; ~Tree() {}; int x; }; /*int anyfunction() { return 1; }*/ },c++,visual-c++,C++,Visual C++,上面的定义位于头文件中,其他文件将调用此文件。我的问题是,如果我在anyfunction中注释了函数部分,一切都很好,但是如果我添加此函数,我会得到以下错误: page_analysis.obj : error LNK2005: "int __cdecl fundamental::anyfunction(void)" (?anyfunction@fundamental@@YAHXZ) already defined in geo_box.obj 1>pa_region_properties

上面的定义位于头文件中,其他文件将调用此文件。我的问题是,如果我在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错误,而不会得到类的LNK2005错误。有什么想法吗?

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

inline int anyfunction()
{
    return 1;
}

HTH Torsten

很可能是您通过头将该函数包含到不同的翻译单元(也称为cpp文件)中。如果确实需要内联该函数,请使用内联:

inline int anyfunction()
{
    return 1;
}

HTH Torsten

如果在头文件中定义了某个内容,那么该定义将在任何翻译单元中复制,粗略地说,就是包含该头文件的每个源文件。有时,多个定义是错误的

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

函数通常不能,但可以通过内联声明来允许:

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

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

// source file
int fundamental::anyfunction() {return 1;}

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

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

函数通常不能,但可以通过内联声明来允许:

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

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

// source file
int fundamental::anyfunction() {return 1;}

您能告诉我为什么从标题中使用名称空间是一种不好的做法吗?我将按照您的建议完善这个问题。@feelfree:put-use-namespace-basical;在头文件中,这样做是不好的,因为它会污染包含它的任何文件中的全局命名空间。但这与这个问题无关。@feelfree:因为它实际上违背了名称空间分隔名称的目的,并且在名称空间声明中包含头时会产生大量问题。请记住,预处理器和编译器是太不同的实体,预处理器几乎只进行文本替换,对语义没有任何线索。您能告诉我为什么从标题使用名称空间是一种不好的做法吗?我将按照您的建议完善这个问题。@feelfree:puting using namespace basical;在头文件中,这样做是不好的,因为它会污染包含它的任何文件中的全局命名空间。但这与这个问题无关。@feelfree:因为它实际上违背了名称空间分隔名称的目的,并且在名称空间声明中包含头时会产生大量问题。请记住,预处理器和编译器是非常不同的实体,预处理器几乎只进行文本替换,没有语义线索。谢谢,这是一个非常详细的解释。谢谢,这是一个非常详细的解释。