0

我在 Visual Studio 项目中有 3 个文件test.cppdate.cppmain.cpp-

测试.cpp:

int g() { return 0; }

日期.cpp:

/*totally empty*/

主.cpp:

#include "test.cpp"
#include "date.cpp"

int main() { return g(); }

我知道如果多次调用头文件,在头文件中定义函数会导致违反单一定义规则。但在这里,我只从一个文件/翻译单元调用它一次。为什么还在扔LNK2005?

4

3 回答 3

4

你不应该包括test.cppand date.cpp。相反,您应该编写test.handdate.h并包含它:

测试.h

int g();

日期.h

// Contains prototypes for functions inside date.cpp

主文件

#include "test.h"
#include "date.h"

int main() { return g(); }
于 2013-04-27T19:32:22.550 回答
3

您在“main.cpp”中包含“test.cpp” - 这很可能是错误的,因为 Visual Studio 还将“test.cpp”编译为单独的文件,然后将“test.obj”与“main.obj”链接”(那些是编译器生成的文件)到“main.exe”中。然后当它在“test.obj”和“main.obj”中找到“g()”时,它会说“嗯?为什么你有两个”(或者,用链接器术语“多个定义的符号”)。

解决方案是声明一个“test.h”,void g();然后将其包含到“main.cpp”中。

于 2013-04-27T19:31:56.187 回答
2

由于test.cpp在 VS 项目中,它将被编译和排列并main.cpp导致多个定义 - 除非您采取特殊措施来防止这种情况发生,例如test.cpp从项目中删除或将其设置为“从构建中排除”。

如果您重命名temp.cpptest.h您将获得两个好处:

  1. VS 在项目中时不会自动编译 a .h,因为它假定该文件旨在从其他文件中包含而不是独立编译。
  2. 它不会让程序员对文件的预期用途感到困惑
于 2013-04-27T19:30:58.950 回答