类的多重定义

时间:2017-04-06 09:20:02

标签: c++

我正在为当前项目编写实用程序功能。

现在,我有一个 utility.h 标头,它定义了一个带静态方法的类:

#pragma once

class Utils
{
public:
    static int firstFunc()
    {
       return 0;
    }

    static bool secondFunc()
    {
      return false;
    }
};

每次我需要使用这些函数时都会包含此标题(目前在两个翻译单元中)并且它可以正常工作。

现在,在代码审查之后,建议用C风格的函数替换这个类。我天真的第一次尝试:

#pragma once

int firstFunc()
{
    return 0;
}

bool secondFunc()
{
    return false;
}

无法链接,返回多个函数定义错误。 我理解为什么会发生这种情况:包含函数定义的头文件 utils.h 存在于两个不同的编译单元中:链接器不知道要使用哪个定义。

我知道解决方案是将定义移到专用的 utils.cpp ,只留下标题中的声明。

我现在的问题是:当我使用静态方法编写类时,为什么没有这种情况发生,当我在不同的翻译单元中仍然有同一类的多个定义时?

1 个答案:

答案 0 :(得分:2)

直接写在类体内的函数定义(静态或非静态)是隐式inline。如果你把定义分开了:

#pragma once

class Utils
{
public:
    static int firstFunc();

    static bool secondFunc();
};

static int Utils::firstFunc()
{
   return 0;
}

static bool Utils::secondFunc()
{
  return false;
}

...您已经目睹完全相同的多重定义错误。

此外,这些不是" C风格的功能",只是免费(非会员)功能。 C ++没有任何反对自由函数的东西;)