首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包括.cpp文件

包括.cpp文件
EN

Stack Overflow用户
提问于 2013-10-23 16:21:38
回答 9查看 220.8K关注 0票数 74

我在这里这样的地方读到过,您必须包含.h文件,而不是.cpp文件,因为否则就会出现错误。所以,例如

main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif

foop.cpp

代码语言:javascript
复制
int foo(int a){
    return ++a;
}

工作正常,但是如果我用#include "foop.h"替换#include "foop.cpp",则会得到一个错误(使用C++ 4.9.9.2,Windows):

代码语言:javascript
复制
multiple definition of foo(int)
first defined here

为什么会这样呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-10-23 16:24:45

include所做的是从文件中复制所有内容(这是<>""中的参数),所以当预过程程序完成其工作时,main.cpp将如下所示:

代码语言:javascript
复制
// 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中也存在一个定义,因此编译器会因为函数复制而“混乱”。

票数 74
EN

Stack Overflow用户

发布于 2013-10-23 16:25:59

有很多理由阻止包含.cpp文件,但严格来说并不是不允许的。您的示例应该编译得很好。

问题可能是您同时编译了main.cpp和foop.cpp,这意味着foop.cpp的两个副本被链接在一起。链接者在抱怨重复。

票数 45
EN

Stack Overflow用户

发布于 2013-10-23 16:26:15

当您说#include "foop.cpp"时,就好像您复制了foop.cpp的全部内容并将其粘贴到main.cpp中一样。

因此,在编译main.cpp时,编译器会发出一个包含两个函数的可执行代码的main.objmainfoo

编译foop.cpp本身时,编译器会发出一个foop.obj,其中包含函数foo的可执行代码。

当您将它们链接在一起时,编译器会看到函数foo的两个定义(一个来自main.obj,另一个来自foop.obj),并抱怨您有多个定义。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19547091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档