我真的不明白这背后的原因,但我想我已经弄明白了。
我的兄弟正在做一个家庭作业项目,他们正在使用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.h
,general_functions.cpp
和class_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编译就好了。
问题是为什么?这样做的理由或可能带来的好处是什么?
答案 0 :(得分:1)
.cpp和.h文件之间的区别在于.h文件通常包含在#include指令中,而.cpp文件包含在链接过程中。
#include指令将在您正在编译的代码中插入包含文件的副本,因此通过包含.cpp文件,您将编译包含所有.cpp文件的单个源文件。这是非常糟糕的做法,但仍然有效。
但是,如果您在链接步骤中也添加了.cpp文件,那么您将再次添加这些文件,从而创建可能重复的函数定义,例如:链接器错误。我认为这可能是主要的错误(没有链接器错误代码,我只是在猜测)。