类的内联函数的实现应该放在哪里

转载 2016年06月02日 10:09:24

作者:朱金灿
来源:http://blog.csdn.net/clever101/


      今天公司研发部举行会议,讨论执行代码审查事宜。在讨论到一条:头文件不能放函数实现代码,我提出异议:内联函数应该例外。同事反驳说:内联函数的实现也可放进cpp文件。我摆出我的理由:如果是类的内部使用该类的内联函数,函数实现放哪都行(头文件和cpp文件都可以);但是如果外部调用类的内联函数同时该函数的实现又是放在cpp中,那会出现错误。同事于是问我会出现什么错误,当时我也没答上来。于是大家就先略过再去讨论其它方面。


       我记得当年我还在CSDN上发过一个讨论的帖子,于是到网上搜索了一下,链接如下:


C++中的inline函数的实现部分应该放在哪里呢?


      晚上回去写代码测试一下,如果把内联函数的实现放在cpp文件而外部又调用这个函数的话,确实会出现这个函数无法识别的错误。测试办法如下:


新建一个CTest类,在头文件这样声明:


[cpp] view plain copy
  1. class CTest  
  2. {  
  3. public:  
  4.     CTest(void);  
  5.     ~CTest(void);  
  6.     inline int GetValue();  
  7. };  


在cpp文件这样实现:


[cpp] view plain copy
  1. #include "test.h"  
  2. CTest::CTest(void)  
  3. {  
  4. }  
  5. CTest::~CTest(void)  
  6. {  
  7. }  
  8. inline int CTest::GetValue()  
  9. {  
  10.     return 0;  
  11. }  


然后在main函数这样调用:


[cpp] view plain copy
  1. #include "test.h"  
  2. int main( )  
  3. {  
  4.     CTest test;  
  5.     test.GetValue();  
  6.     getchar();  
  7. }  



不出意外的话应该会出现下面的链接错误:

1>TestSort.obj : error LNK2019: unresolved external symbol "public: int __thiscall CTest::GetValue(void)" (?GetValue@CTest@@QAEHXZ) referenced in function _main
1> F:/MyTest/MyTest/src/Debug/TestSort.exe : fatal error LNK1120: 1 unresolved externals


    我的编译环境是:VS 2008 + sp1,Win XP + sp3。

要解决这个错误,需要把CTest类的GetValue函数放回CTest类的头文件。如下:



[cpp] view plain copy
  1. // test.h  
  2. #pragma once  
  3. class CTest  
  4. {  
  5. public:  
  6.     CTest(void);  
  7.     ~CTest(void);  
  8.     int GetValue()  
  9.     {  
  10.         return 0;  
  11.     }  
  12. };  


  或者是这样:


[cpp] view plain copy
  1. // test.h  
  2. #pragma once  
  3. class CTest  
  4. {  
  5. public:  
  6.     CTest(void);  
  7.     ~CTest(void);  
  8.     int GetValue();  
  9. };  
  10. inline int CTest::GetValue()  
  11. {  
  12.     return 0;  
  13. }  



      《高质量C++编程》的作者林锐博士推荐后一种做法,认为后者是一种良好的编程风格。后来查了查《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译),里面给出的理论依据是:由于内联函数必须在调用它的每个文本文件中被定义,所以没有在类体中定义的内联成员函数必须被放在类定义出现的头文件中。



参考文献:


1. 《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译)。


2. 《高质量C++编程》,林锐著。


内联函数、模板函数 之于头文件

本文转自CSDN 一、基本说明 C++标准中提到,一个编译单元[translationunit]是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包...
  • guoxiaoqian8028
  • guoxiaoqian8028
  • 2014年06月12日 13:10
  • 779

inline内联函数(声明前加inline还是定义前加inline)

inline
  • heli200482128
  • heli200482128
  • 2016年06月18日 14:47
  • 2075

c++ 内联函数 (讲解的TM真好)

1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下: int max(int a, int b) {  return a > b ? a : b;...
  • u011327981
  • u011327981
  • 2016年01月28日 16:49
  • 17631

内联函数的声明和定义

内联函数的声明和定义 一、什么叫inline函数?  inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而...
  • yippeelyl
  • yippeelyl
  • 2015年05月12日 09:51
  • 1268

c++内联函数(inline)及内联函数的使用及注意点

以下转自:http://www.jb51.net/article/48622.htm 介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏...
  • wyq_tc25
  • wyq_tc25
  • 2016年06月20日 16:26
  • 1908

c++ 内联成员函数

内联成员函数 类中的成员函数分为一般成员函数和内联成员函数。 把成员函数的代码放入类声明中,这种方式定义的类成员函数就叫内联成员函数(隐式定义)。程序使用内联成员函数的方式与一般的成员函数的调用方...
  • u011484045
  • u011484045
  • 2015年03月21日 14:15
  • 1524

函数模板、 内联函数

函数重载就是有相同的函数名但参数的个数或类型不同从而根据不同的参数个数和参数类型来调用相应的方法。    我们发现函数重载只是解决了函数命名的问题,但函数体虽然相同我们还是要重复的写,为了解决这一问...
  • QH_JAVA
  • QH_JAVA
  • 2013年06月03日 13:29
  • 2516

内联函数(inline)总结

1:定义:       它们看起来象函数,运作起来象函数,比宏(macro)要好得多,使用时还不需要承担函数调用的开销。当内联一个函数时,编译器可以对函数体执行特定环境下的优化工作。这样的优化对"正...
  • a623891391
  • a623891391
  • 2016年01月30日 20:15
  • 11636

java final方法与java内联函数

《java编程思想》中讲到final方法时提到,使用final方法原因有两个, 一、锁定方法。防止任何继承类修改、覆盖 二、效率。在java早期实现中,如果将一个方法指明为final,就是同意编译...
  • Rflyee
  • Rflyee
  • 2016年04月05日 19:28
  • 5135

内联(inline)函数的优缺点

最近在看LinuxKernel Development,这本书主要是讲了Linux内核的概念,对于整体的框架有了一个描述,这里记录下看到的一些有用的东西,便于以后整理。     Inline这个名称...
  • j00362
  • j00362
  • 2015年12月01日 09:23
  • 1678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的内联函数的实现应该放在哪里
举报原因:
原因补充:

(最多只允许输入30个字)