为什么我要在这里显式地声明内联函数

Why do I explicitly have to declare functions inline here?

本文关键字:声明 函数 我要 在这里 为什么      更新时间:2023-10-16

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

我也使用包含保护,但我仍然得到多个定义对象的链接错误,我知道这是因为所有这些不同的单位复制的东西,链接器试图找出哪个项目是正确的。

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

然而,我必须明确地定义所有这些小函数在我写的小头工具集中。

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

但是我必须这样定义它们。

的例子:

#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__

错误是,blabla已经在xxx中定义。Obj,对于每个包含文件

的单元

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

那是什么原因?这不是一个大问题,而且,优化也可能在cpp中找到内联的东西,对吧?

我只是好奇为什么在这里,希望没有太多的重复,谢谢你的时间。

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

另外,请注意包含双下划线的名称是为c++实现保留的-不允许在自己的代码中创建这样的名称。

成员函数可能是内联的-你不能强制内联!-如果(a)它们是在类中定义的,或者(b)你在定义中使用了inline子句。注意,如果使用内联子句,不应该在头文件中定义函数——唯一的例外是模板,因为它们是"特殊的"。
正如你刚刚更新的问题:
该头文件的每个用户都将拥有函数的定义->多个定义。您需要将定义和声明分开!

这都是关于一个定义规则。这表明,在一个c++程序中,你只能对每个非内联函数(以及各种其他类型的实体)有一个定义,这些定义跨越你链接进来制作程序的所有翻译单元。

标记一个函数inline使一个异常对通常的一个定义规则。它声明(意译)每个翻译单元可以有一个内联函数的定义,前提是所有的定义都匹配,并且在使用内联函数的每次翻译中都提供了一个定义。

Include守卫可以通过多次包含包含定义的头文件来防止您意外地在每个翻译单元中提供多个定义。

要满足非内联函数的一个定义规则,您仍然必须确保只有一个包含函数定义的翻译单元。通常的方法是只在头文件中声明函数,并使用包含定义的单个源文件。