包括 .cpp 文件

新手上路,请多包涵

我在像 这里 这样的地方读到你必须包含 .h 文件而不是 .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);
#endif

foop.cpp

 int foo(int a){
    return ++a;
}

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

 multiple definition of foo(int)
first defined here

为什么是这样?

原文由 user2664110 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
2 个回答

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 也存在定义,因此编译器由于函数重复而“感到困惑”。

原文由 xorguy 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想澄清一点:不需要包含头文件来让链接器理解你想要什么。您可以声明它,它将被很好地链接。

主.cpp:

 #include <iostream.h>
//not including "foop.cpp"!

int foo(int a);

int main(){
  std::cout << foo(4) << std::endln;
}


foop.cpp:

 int foo(int a){
  return a++;
}

我不鼓励这样做,但要知道标头并不是您必须遵循才能使代码编译的魔法。

原文由 Fizz Areh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题