2

我在一个可能非常微不足道的问题上被困了几个小时。

这是类的最基本用法。

头文件: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;
}

驱动程序:main.cpp

#include <iostream>
#include "person.cpp"

int main()
{
  std::cout << "Yes, it worked.\n";
  return 0;
}

尝试在 CodeBlocks 中编译此代码(使用 GNU GCC)时,出现错误:

~\person.cpp|5|multiple definition of `person::setName(std::string)'|
~\person.cpp|5|first defined here|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|

我在头文件中有一个原型,在实现文件中有一个正文。多重定义在哪里?如果我在 person.cpp 中的 'void' 之前添加 'inline' 就可以了,但在这种情况下我为什么要这样做呢?

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

4

3 回答 3

4

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

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

另外,您需要添加包含防护

#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif

或者只是添加

#pragma once

如果您的编译器支持它。

于 2013-01-10T05:37:28.463 回答
2

今天发生了这种情况。

当使用 file - new 等在代码块中添加文件时,会出现一个屏幕询问您是否要将文件包含在调试和发布版本中。您通过勾选方框无辜地回答“是”。结果是该文件被自动包含在内,当您自己明确包含它时,您最终会复制。所以,不要勾选那些框。

干杯

于 2014-05-21T20:44:27.777 回答
0

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

g++ main.cpp -o main.o

g++ 人.cpp -o 人.o

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

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

于 2013-07-25T15:05:40.257 回答