我正在为当前项目编写实用程序功能。
现在,我有一个 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 ,只留下标题中的声明。
我现在的问题是:当我使用静态方法编写类时,为什么没有这种情况发生,当我在不同的翻译单元中仍然有同一类的多个定义时?
答案 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 ++没有任何反对自由函数的东西;)