C++ 正确放置';内联';

C++ 正确放置';内联';,c++,C++,我应该将inline正确放置在哪里 测试1.h: class test1 { inline void method1() {} }; 测试2.h: class test2 { void method2(); }; inline void test2::method2() {} 测试3.h: class test3 { inline void method3(); }; inline void test3::method3() {} 测试4.h: clas

我应该将
inline
正确放置在哪里


测试1.h:

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

测试2.h:

class test2
{
    void method2();
};

inline void test2::method2() {}

测试3.h:

class test3
{
    inline void method3();
};

inline void test3::method3() {}

测试4.h:

class test4
{
    inline void method4();
};
test4.cpp:

void test4::method4() {}

测试5.h:

class test5
{
    inline void method5();
};
test5.cpp:

inline void test5::method5() {}

测试6.h:

class test6
{
    void method6();
};
test6.cpp:

inline void test6::method6() {}

测试7.h:

class test7
{
    inline void method7();
};

void test7::method7() {}

(我习惯于像示例6中那样编写代码,但阅读了大量的
inline
,现在我对这一点不再有把握了) 以下哪个示例是
内联
的正确用法,为什么它们不同,它们都有效吗

编辑#1:
所有这些例子都是私有的,我一开始没有想到公共的和受保护的。如评论中所述,可能会因此而出现重大错误。

如果您愿意,您的示例中除4、5和6之外的所有示例都是正确的 在使用
inline
进行声明之前,不要调用函数 有人看见了。实际上,7是我在英国见过的唯一一个 成功的大型项目;对于本地类,在中定义 还使用了源文件1,但没有
inline
关键字 (这在这里是隐含的)。

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

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

在第一种情况下,
inline
关键字是多余的:类定义中定义的函数是隐式内联的


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

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

下面是一篇简短的MSDN文章,概述如下:

IMHO测试6基本上与测试2相同,并且两者都是正确的(如果我所做的是“正确的”)。将
内联
用作优化功能基本上已经过时了。今天,它仍然被用于它对链接的影响。然而,
inline
的这种用法有点不常见,如果你想要一种“最不意外”的编程风格,你应该尽量避免它。哦,还有。没关系,反正会被忽略:)@RogerRowland 6不正确。@JamesKanze你能解释为什么6不正确吗?你看到7多于2吗?我有过相反的经历。@Simple我从未在实际代码中见过2(尽管它是合法的)。“如果在看到内联声明之前不调用函数”-为什么不?有什么规则是我和我使用的编译器都不知道的吗?@MikeSeymour既然你提到了,我不确定这个限制。它出现在CFront:-),从那以后我就没有真正考虑过这个问题。从逻辑上讲,我们将期望约束,考虑到C++希望编译器的行为方式,但是我不能在标准中直接找到它。(当然,如果您使用的是2,那么问题就不会出现。)@JamesKanze我不确定我们的编码标准是否要求(2),但我从未在我工作的代码中见过7