连接包含文件时,为什么Visual Studio会出错?

时间:2014-03-11 01:27:10

标签: c++ visual-studio visual-studio-2012 msbuild

我真的不明白这背后的原因,但我想我已经弄明白了。

我的兄弟正在做一个家庭作业项目,他们正在使用Visual Studio。他在编写项目时遇到了问题。有关项目包括:

main.cpp
classes.h
class_functions.cpp
general_functions.cpp

他们有以下导入结构:

的main.cpp

#include "classes.h"
#include "class_functions.cpp"
#include "general_functions.cpp"

class_functions.cpp

#include "classes.h"

general_functions.cpp

#include "classes.h"

在尝试编译时,他一直遇到链接错误,即使g ++编译得很好。所以我尝试通过Visual Studio命令提示符和cl。编译得很好,所以我尝试了msbuild(显然?)失败了。我进入了vxproj文件,因为嘿,它是什么告诉cl我不是?

在proj文件中,它包括classes.hgeneral_functions.cppclass_functions.cpp,以及main.cpp。当我删除一般和类函数时,msbuild运行得很好。把它们中的任何一个放回去并且繁荣classes.h包含

#ifndef myclasses
#define myclasses
/* Code here */
#endif

其他.cpp文件包含类似的指令。

我终于想出了如何消除这个问题 - 消除

#include "general_functions.cpp"
#include "class_functions.cpp"

来自代码库,现在Visual Studio编译就好了。

问题是为什么?这样做的理由或可能带来的好处是什么?

1 个答案:

答案 0 :(得分:1)

.cpp和.h文件之间的区别在于.h文件通常包含在#include指令中,而.cpp文件包含在链接过程中。

#include指令将在您正在编译的代码中插入包含文件的副本,因此通过包含.cpp文件,您将编译包含所有.cpp文件的单个源文件。这是非常糟糕的做法,但仍然有效。

但是,如果您在链接步骤中也添加了.cpp文件,那么您将再次添加这些文件,从而创建可能重复的函数定义,例如:链接器错误。我认为这可能是主要的错误(没有链接器错误代码,我只是在猜测)。