【问题标题】:C++ Multiple definitionC++ 多重定义
【发布时间】:2012-01-19 20:49:33
【问题描述】:

所以我有一个头文件,其中包含函数实现以及原型。我现在正试图将这些实现与文件分开并留下原型,因为我知道将实现放在头文件中并不是一个好的标准。但是,当我从头文件中删除实现并将它们放入自己的 cpp 文件中,然后尝试将该 cpp 文件链接到项目的其余部分时,它会抱怨函数的多个定义。感谢您的任何帮助/建议

std::bitset<LENGTH>  foo1(const std::string stringVal);
std::bitset<LENGTH>  foo2(const int decimalVal);
std::string          foo3(const int integerVal);

我有一个包含保护,所以它也不会被多次包含。

然后在 cpp 中,我只是简单地实现了这些功能。然而,如果它们与头文件分开,它会抱怨函数的多个定义。

编辑:我的愚蠢错误已解决。

【问题讨论】:

  • 错误信息是什么,引发错误信息的代码是什么?
  • 您没有提供足够的信息来回答您的问题。请提供一个至少显示以下内容的小示例:(1) 头文件的内容,(2) .cpp 文件的内容,(3) 链接器命令行。特别是,#include 行可能最相关。

标签: c++ header-files


【解决方案1】:

这只是一个声明。即使该文件没有包含保护,它也不会给出该错误。

多个定义通常意味着您在多个实现文件中定义函数。

这是一个清单:

  • 确保实现定义在标题之外。

  • 确保只有一个源文件定义函数

  • 确保你没有包含源文件(这个很琐碎,希望你知道不要这样做)

  • 最后,检查您是否运行了干净的构建

【讨论】:

    【解决方案2】:

    我猜你没有编译之前包含头文件的其他 cpp 文件。所以目标文件仍然包含定义。顺便说一句,在头文件中没有实现根本不是好的标准。这是必须的,这样您就可以在多个编译单元中包含相同的头文件。

    【讨论】:

    • 实际上,如果方法是内联的或使用模板的,你可以在头文件中实现(在这种情况下,它是必需的)。
    • 你说得对,对不起,我只是想强调这不是风格或良好标准的问题。无论哪种方式,它都是必要的(即使是在模板化函数的情况下,尽管在内联的情况下你可以忍受警告消息)
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多