正确放置'内联'

时间:2014-01-31 12:09:21

标签: c++

我在哪里正确放置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。正如评论中所述,因此可能会出现重大错误。

3 个答案:

答案 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