正确放置'inline'

Correct placement of 'inline'

本文关键字:inline      更新时间:2023-10-16

我将inline正确地放在哪里?


test1.h:

class test1
{
inline void method1() {}
};

test2.h:

class test2
{
void method2();
};
inline void test2::method2() {}

test3.h:

class test3
{
inline void method3();
};
inline void test3::method3() {}

test4.h:

class test4
{
inline void method4();
};

test4.cpp:

void test4::method4() {}

test5.h:

class test5
{
inline void method5();
};

test5.cpp:

inline void test5::method5() {}

test6.h:

class test6
{
void method6();
};

test6.cpp:

inline void test6::method6() {}

test7.h:

class test7
{
inline void method7();
};
void test7::method7() {}

(我习惯于像示例6中那样编码,但读了很多inline,现在我不再确定了)这些例子中哪一个是inline的正确用法,为什么它们不同,它们都有效吗?

编辑#1:所有这些例子都是private,我一开始没有想到publicprotected。正如评论中所说,因此可能会出现重大错误。

4、5和6(可能)是错误的:内联函数必须在每个使用它们的翻译单元中定义,因此这些函数只允许在一个翻译单元中使用该函数。对于只由同一源文件中定义的其他函数调用的私有函数来说,这可能是可以接受的,但会阻止您通常想要的头中声明的函数的更通用用法。

其他的都是等价的:它们在一个头中至少包含一个内联声明,并且只包含一个定义,这样定义就可以包含在任何需要的地方。(只要标头得到适当的保护,不被重新包含,以防止在一个翻译单元中有多个定义)。

在第一个例子中,inline关键字是多余的:类定义中定义的函数是隐式内联的。

我建议不要使用3和7,因为如果您以后决定函数不应该是内联的,它们需要更改声明和定义。这使得1和2成为我的首选;我只会对非常短的函数使用1,以避免混淆类定义。

除了4、5和6之外的所有示例都是正确的,前提是在具有inline的声明具有被看到。在实践中,7是我在成功的大型项目;对于本地类,在中定义源文件,也使用1,但没有inline关键字(这在这里是隐含的)。

Test 4我认为可能会给您带来编译错误,因为编译器将在声明所在的文件中预期代码。inline关键字指定代码的实际正文(在同一文件中,链接),并在调用函数的位置插入完整的代码正文。第一部分很重要,因为如果代码体位于与内联指定的文件不同的文件中。。。编译将失败。

下面是MSDN的一篇短文,概述如下:http://msdn.microsoft.com/en-us/library/1w2887zk.aspx