在头文件中定义函数是否有弊端?

Is defining functions in header files malpractice?

我们有这个头文件: headerA.h

#pragma once
#include <iostream>

void HeaderADefinedFunction()
{
std::could << "HeaderDefinedFunction called!\n";
}

然后里面sourceB.cpp

#include "headerA.h"
void FunctionB()
{
HeaderADefinedFunction();
}

里面 sourceC.cpp

#include "headerA.h"
void FunctionC()
{
HeaderADefinedFunction();
}

在头文件本身中定义函数 HeaderADefinedFunction() 有哪些负面影响。该定义是否是该特定函数的 link 时间符号解析的最佳形式?

代码 as-shown 应该产生 link 失败,带有 multiply-defined HeaderADefinedFunction() 符号。

要使代码真正有效,必须使功能inline

Is defining functions in header files malpractice?

完全没有。事实上,template 函数 必须 定义在 header1.

What are the negative aspects of defining the function HeaderADefinedFunction() in the header file itself.

一个缺点是,如果您更改定义,您必须重建每个 .cpp #include这是 header,增加重建时间。

另一个是您的 object 文件较大。

Would that definition be in an optimal form for link-time symbol resolution of that particular function?

如果您在 header 中定义函数(并使其内联),编译器可能会选择将其内联到部分(或全部)调用点。不需要 LTO。

如果您,编译器将无法执行此类内联,除非您使用 LTO。


1 除非您知道 template 实例化的所有类型并为所有类型提供显式实例化。