【问题标题】:Including a cpp file that includes a header file [duplicate]包括一个包含头文件的cpp文件[重复]
【发布时间】:2020-07-05 15:23:06
【问题描述】:

由于学校工作,我正在尝试学习 C++。最近我想出了一个困扰我一段时间的问题。如果有3个文件,main.cpp、Fish.cpp、Fish.h

Fish.h:

#ifndef FISH_H
#define FISH_H

class Fish
{
    public:
        Fish();
};

#endif

Fish.cpp:

#include <iostream>
#include Fish.h
using namespace std;

Fish::Fish()
{
    cout << "I love fish" << endl;
}

main.cpp:

#include <iostream>
#include "Fish.cpp"
using namespace std;

int main(){
    Fish Salmon;
    return 0;
}

问题来了,我知道如果我想在“main.cpp”中使用Fish()构造函数,我应该包含Fish.h,然后编译所有3个文件,但出于好奇,我试图包括“Fish.cpp”。如果我在“main.cpp”中包含“Fish.cpp”,那么 Fish.cpp 中的所有内容都将被复制到 main.cpp,其中包括 行,对吗?但是为什么每次编译运行,终端都会报错呢?

【问题讨论】:

  • 请提供您收到的错误消息。但无论如何,从不在其他文件中包含 .cpp 文件。
  • #include Fish.h的语法在Fish.cpp中不正确,应该是#include "Fish.h";这是你得到的错误吗?
  • "then compile all 3 files" -- 不,你只有两个源文件要编译。源文件 (.cpp) 被编译。头文件 (.h) 获取 #included(反之亦然)。

标签: c++ class constructor compilation header


【解决方案1】:

包括header 文件,而不是cpp 文件。

Fish.cpp

#include <iostream>
#include "Fish.h" // change here
using namespace std;

Fish::Fish()
{
    cout << "I love fish" << endl;
}

main.cpp

#include <iostream>
#include "Fish.h" // change here
using namespace std;

int main(){
    Fish Salmon;
    return 0;
}

【讨论】:

  • "我知道 [...] 我应该包含 Fish.h,然后编译所有 3 个文件,但出于好奇,我尝试包含“Fish.cpp” ”:OP 知道这一点。这不是问题。
  • 感谢帮助理解问题。 Fish.cpp 包含 Fish.h 标头。那么,如果main.cpp 可以包含Fish.cpp 文件,那么main.cpp 包含Fish.hFish.cpp 两者,对吧?
  • 我认为这个链接会有所帮助。 cplusplus.com/forum/general/39618。这里Fish.cpp实际上被编译了两次,所以会出现一些问题。而且,一旦链接器开始组合您的目标文件,它就会拾取您在 Fish.cpp 中的任何内容的多个定义,并引发一些错误。
  • 是的,基本上,这很可能是 OP 的问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2012-02-08
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多