【发布时间】:2022-01-21 02:56:49
【问题描述】:
我们有这个头文件: 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() 有哪些负面影响。该定义是否是该特定函数的链接时符号解析的最佳形式?
【问题讨论】:
-
您有兴趣了解one definition rule,以及编写不违反单一定义规则的函数的方法。
-
同一个函数会有两个定义,所以违反了ODR;无需诊断。而且,从项目管理的角度来看,如果你改变了
HeaderADefinedFunction的实现,你必须重新编译两个源文件;如果它在它自己的源文件中,你只需要重新编译那个。 -
@DrewDormann 谢谢,这会有所帮助
-
@PeteBecker 我的错,我在浴室里用头顶打字,它是 iostream
-
将
void HeaderADefinedFunction()更改为inline void HeaderADefinedFunction()。inline关键字允许您在多个翻译单元中定义函数并将它们链接在一起。