gpt4 book ai didi

c++ - gcc 多重定义...仅发布

转载 作者:行者123 更新时间:2023-12-02 03:42:16 25 4
gpt4 key购买 nike

我在头文件中定义了一个函数。在调试中,它可以很好地编译和链接。在发行版中,对于包含 header 的每个类的每个对象文件,我都会收到编译错误“‘blah::blah(blah& blah)’的多重定义”。

我正在使用 gcc-4.8.1。我无法发布实际的代码,该版本已更改名称以保护无辜者:

#ifndef INCLUDE_SMELLS_FUNNY
#define INCLUDE_SMELLS_FUNNY

#include "ParentClass.h"
#include "ChildClassA.h"
#include "ChildClassB.h"

namespace someplace {

bool smellsFunny(const ParentClass& someData) {

// All ChildClass As smell funny
if(dynamic_cast<const ChildClassA*>(&someData)) {
return true;
}

// If ChildClass B, need to check if smells funny
const ChildClassB* childB = dynamic_cast<const ChildClassB*>(&someData)
if(childB) {
return childB->MoreThanAWeekOld();
}

// Default is smells OK
return false;
}

}

#endif // INCLUDE_SMELLS_FUNNY

我无法找到哪个 gcc 标志负责。当然,修复方法只是将实现移至 cpp 文件中。但为什么这是必要的呢?为什么这种情况只在发布时发生?

最佳答案

这是因为您在头文件中定义了该函数,然后将该头文件包含在多个源文件中。这意味着该函数将在包含 header 的每个源文件(技术上是翻译单元)中定义。

对此有几种解决方案:

  1. 将函数标记为静态。这意味着翻译单元中的每个定义都不会被导出。
  2. 将函数标记为内联。这与第一个替代方案的工作原理基本相同。
  3. 将函数的定义放在源文件中,并且仅将其声明放在头文件中。

对于像您这样的小函数,替代方案 2 可能是一个不错的选择。如果您有一个较大的函数,无法轻松内联,您应该选择替代方案 3。

此外,如果您选择第 3 种,则不需要包含头文件,从而减少循环包含的风险。

关于c++ - gcc 多重定义...仅发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com