我在哪里正确放置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
,我首先没有想到public
和protected
。正如评论中所述,因此可能会出现重大错误。
答案 0 :(得分:5)
4,5和6(可能)错误:必须在每个使用它们的翻译单元中定义内联函数,因此这些函数只允许在一个翻译单元中使用该函数。对于仅由同一源文件中定义的其他函数调用的私有函数,这可能是可接受的,但是阻止了您通常希望从标头中声明的函数中使用的更一般的用法。
其他都是等价的:它们在标题中至少包含一个内联声明和一个定义,以便定义可以包含在需要的任何位置。 (只要标题被正确保护以防止重新包含,就可以防止在单个翻译单元中进行多个定义。)
在第一个中,inline
关键字是多余的:在类定义中定义的函数是隐式内联的。
我会建议反对3和7,因为如果你后来决定该函数不应该是内联的,它们需要更改声明和定义。这使得1和2成为我的首选;并且我只使用1来表示非常短的函数,以避免使类定义混乱。
答案 1 :(得分:2)
除了4,5和6之外,您的所有示例都是正确的
在inline
声明之前不要调用该函数
被人看见了。在实践中,7是我见过的唯一一个
成功的大型项目;对于本地类,定义于
还使用了源文件1,但没有inline
关键字
(这是隐含的)。
答案 2 :(得分:1)
测试4我相信可能会给你一个编译错误,因为编译器会期望声明所在的文件中的代码。 inline关键字指定代码的实际主体(在同一文件中,链接)以及插入调用函数的代码的完整主体。第一部分很重要,因为如果代码的主体位于与您指定内联的文件不同的文件中...编译将失败。
这是一篇简短的MSDN文章,展示了一个概述: http://msdn.microsoft.com/en-us/library/1w2887zk.aspx