我在这里这样的地方读到过,您必须包含.h文件,而不是.cpp文件,因为否则就会出现错误。所以,例如
main.cpp
#include <iostream>
#include "foop.h"
int main(int argc, char *argv[])
{
int x=42;
std::cout << x <<std::endl;
std::cout << foo(x) << std::endl;
return 0;
}foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endiffoop.cpp
int foo(int a){
return ++a;
}工作正常,但是如果我用#include "foop.h"替换#include "foop.cpp",则会得到一个错误(使用C++ 4.9.9.2,Windows):
multiple definition of foo(int)
first defined here为什么会这样呢?
发布于 2013-10-23 16:24:45
include所做的是从文件中复制所有内容(这是<>或""中的参数),所以当预过程程序完成其工作时,main.cpp将如下所示:
// iostream stuff
int foo(int a){
return ++a;
}
int main(int argc, char *argv[])
{
int x=42;
std::cout << x <<std::endl;
std::cout << foo(x) << std::endl;
return 0;
}所以foo将在main.cpp中定义,但是在foop.cpp中也存在一个定义,因此编译器会因为函数复制而“混乱”。
发布于 2013-10-23 16:25:59
有很多理由阻止包含.cpp文件,但严格来说并不是不允许的。您的示例应该编译得很好。
问题可能是您同时编译了main.cpp和foop.cpp,这意味着foop.cpp的两个副本被链接在一起。链接者在抱怨重复。
发布于 2013-10-23 16:26:15
当您说#include "foop.cpp"时,就好像您复制了foop.cpp的全部内容并将其粘贴到main.cpp中一样。
因此,在编译main.cpp时,编译器会发出一个包含两个函数的可执行代码的main.obj:main和foo。
编译foop.cpp本身时,编译器会发出一个foop.obj,其中包含函数foo的可执行代码。
当您将它们链接在一起时,编译器会看到函数foo的两个定义(一个来自main.obj,另一个来自foop.obj),并抱怨您有多个定义。
https://stackoverflow.com/questions/19547091
复制相似问题