为什么我必须在这里明确声明内联函数?

Eri*_*ius 0 c++ inline linker-errors

好吧,到目前为止,我认为头文件中定义的函数被视为内联函数,就像模板的东西一样,定义一次,等等。

我也使用包含防护,但我仍然遇到多个已定义对象的链接器错误,我知道这是因为所有这些不同的单元都复制了链接器试图挑选出哪个项目是正确的内容。

我还知道内联只是一个建议,甚至可能不会被编译器使用等。

然而,我必须在我编写的只有标头的小工具集中显式定义所有这些小函数。

即使函数很大,我也必须将它们声明为内联,并且编译器仍然可能忽略该提示。

但无论如何我必须这样定义它们。

例子:

#ifndef texture_math_h__
#define texture_math_h__

float TexcoordToPixel(float coord, float dimension)
{
    return coord * dimension;
}

float PixelToTexcoord(float pixel, float dimension)
{
    return pixel / dimension;
}

float RecalcTexcoord(float coord,float oldDimension, float newDimension)
{
    return PixelToTexcoord(TexcoordToPixel(coord,oldDimension),newDimension);
}
#endif // texture_math_h__
Run Code Online (Sandbox Code Playgroud)

对于包含该文件的每个单元,错误是 blabla 已在 xxx.obj 中定义

当我声明所有这些内联时,它链接正确。

这是什么原因呢?这不是一个大问题,而且,优化也可能在 cpp 中找到,对吗?

我只是好奇为什么会出现在这里,希望它不会太多重复,谢谢您的宝贵时间。

小智 5

包含防护仅防止代码被包含在同一翻译单元中两次。因此,如果您有多个包含相同标头的文件,则代码会被包含多次。默认情况下,标头中定义的函数不是内联的,因此这会给您带来链接器错误 - 您需要使用 inline 关键字定义这些函数,除非它们是类的成员函数。

另请注意,包含双下划线的名称是为 C++ 实现的目的而保留的 - 不允许您在自己的代码中创建此类名称。