2014-01-31 50 views
5

我在哪里可以正确放置inline'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现在即时通讯不知道这anylonger) 其中的这些例子是inline正确使用率,为什么他们不同,他们是所有有效?

编辑#1: 所有这些例子确实是private,我没有想到publicprotected摆在首位。正如评论中指出的那样,可能会因此而发生重大错误。

+0

恕我直言,测试6基本相同,测试2无一不是正确的(当然,如果这样做我做的是“正确”)。 –

+0

使用'inline'作为优化功能基本上已经过时了。今天它仍然用于联动的效果。然而,这种'inline'的使用比普通的要少一些,如果你想要一个“最少惊讶”的编程风格,你应该尽可能地避免它。哦,[常问问题](http://www.parashift.com/c++-faq-lite/inline-functions.html)。 – DevSolar

+0

真的不重要,它会被忽略:) –

回答

4

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

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

首先,inline关键字是多余的:在类定义中定义的函数隐式内联。

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

2

除了4,5和6以外的所有示例都是正确的,只要您在inline已有 被发现之前不要调用该函数。实际上,7是我在 成功的大型项目中见过的唯一一个;对于本地类,在 中定义了一个源文件,也使用了1,但没有使用inline关键字 (这里是隐含的)。

+4

你看到7个以上?我有相反的经历。 – Simple

+0

@Simple我从来没有见过2在实际的代码(虽然它是合法的)。 –

+0

“,前提是您在使用内联的声明之前不要调用该函数” - 为什么不?是否有一些规则,我和我所使用的编译器都不知道? –

1

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

这里用一个概述短MSDN文章: http://msdn.microsoft.com/en-us/library/1w2887zk.aspx