在头文件中定义函数是否有弊端?
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
实例化的所有类型并为所有类型提供显式实例化。
我们有这个头文件: 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
实例化的所有类型并为所有类型提供显式实例化。