C++ 编译C+;时出现多定义错误+;代码块中的代码

C++ 编译C+;时出现多定义错误+;代码块中的代码,c++,compiler-errors,codeblocks,C++,Compiler Errors,Codeblocks,我被一个可能很琐碎的问题困扰了好几个小时 这是类的最基本用法 头文件:person.h class person { protected: std::string _Name; public: void setName(std::string); }; 实现:person.cpp #include <string> #include "person.h" void person::setName(std::string name) { _Name =

我被一个可能很琐碎的问题困扰了好几个小时

这是类的最基本用法

头文件:person.h

class person
{
  protected:
    std::string _Name;
  public:
    void setName(std::string);
};
实现:person.cpp

#include <string>
#include "person.h"

void person::setName(std::string name)
{
  _Name = name;
}
我在头文件中有一个原型,在实现文件中有一个主体。多重定义在哪里?如果我在person.cpp中的“void”之前添加“inline”,它会起作用,但在这种情况下为什么要添加


此外,当在cmd中编译与“g++main.cpp-o main.exe”相同的代码时,它可以完美地工作(没有内联)

您不需要在main.cpp中包含
*.cpp
文件。您需要包括
*.h
文件

简而言之-
*.cpp
文件包含编译器编译的实现<代码>*.h文件包含定义,可以从
*.cpp
文件中包含。当包含
*.cpp
文件时,将获得同一对象的多个定义

此外,还需要添加include-guard

#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif
或者只是加上

#pragma once

如果您的编译器支持它。

您可以在代码块中的另一个.cpp文件中包含一个.cpp文件。但不要将其添加到您创建的项目中。如果该文件包含在项目中,代码块将尝试按如下方式编译它:

g++main.cpp-o main.o

g++person.cpp-o person.o

然后使用这两个.o文件创建最终的输出文件。由于main.cpp包含func.cpp,您将遇到多声明错误


现在,如果您在项目中只保留main.cpp文件,则只会编译该文件,不会出现相同的错误。

如果今天发生这种情况

当使用file-new等在代码块中添加文件时,会出现一个屏幕,询问您是否希望在调试和发布版本中包含该文件。你在方框上打勾,天真地回答是。结果是该文件被自动包含,当您自己显式地包含它时,您最终会进行复制。所以,不要勾选那些方框

干杯
podge

不包括cpp文件。链接它们。除此之外,你的标题应该有一个include-guard。#pragma曾经不是标准的,它无处不在。此指令由VC++、GCC、Clang和Digital Mars支持。谢谢!将main.cpp的第2行从#include“person.cpp”更改为#include“person.h”,使其正常工作。但现在我有点困惑。我将头文件包括在main.cpp中。头文件没有引用(我可以看到)实现头文件中声明的.cpp文件。为什么我没有得到一个错误?这是在幕后完成的吗?@user1960469编译器编译两个独立的翻译单元-main.cpp和person.cpp。第一个包含函数
main
的定义,第二个包含
setName
的定义。在您的特定示例中,main.cpp不直接包含
person
的实现并不重要,因为您没有使用它。优化编译器只会忽略person.h的内容。但是,如果您实际使用的是该代码,那么链接器将组合两个翻译单元的输出,以便最终二进制文件可以使用该定义。
#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif
#pragma once