类的内联函数的实现应该放在哪里
2010-07-19 21:53
274 查看
作者:朱金灿
来源:http://blog.csdn.net/clever101/
今天公司研发部举行会议,讨论执行代码审查事宜。在讨论到一条:头文件不能放函数实现代码,我提出异议:内联函数应该例外。同事反驳说:内联函数的实现也可放进cpp文件。我摆出我的理由:如果是类的内部使用该类的内联函数,函数实现放哪都行(头文件和cpp文件都可以);但是如果外部调用类的内联函数同时该函数的实现又是放在cpp中,那会出现错误。同事于是问我会出现什么错误,当时我也没答上来。于是大家就先略过再去讨论其它方面。
我记得当年我还在CSDN上发过一个讨论的帖子,于是到网上搜索了一下,链接如下:
C++中的inline函数的实现部分应该放在哪里呢?
晚上回去写代码测试一下,如果把内联函数的实现放在cpp文件而外部又调用这个函数的话,确实会出现这个函数无法识别的错误。测试办法如下:
新建一个CTest类,在头文件这样声明:
在cpp文件这样实现:
然后在main函数这样调用:
不出意外的话应该会出现下面的链接错误:
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类的头文件。如下:
或者是这样:
《高质量C++编程》的作者林锐博士推荐后一种做法,认为后者是一种良好的编程风格。后来查了查《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译),里面给出的理论依据是:由于内联函数必须在调用它的每个文本文件中被定义,所以没有在类体中定义的内联成员函数必须被放在类定义出现的头文件中。
参考文献:
1. 《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译)。
2. 《高质量C++编程》,林锐著。
来源:http://blog.csdn.net/clever101/
今天公司研发部举行会议,讨论执行代码审查事宜。在讨论到一条:头文件不能放函数实现代码,我提出异议:内联函数应该例外。同事反驳说:内联函数的实现也可放进cpp文件。我摆出我的理由:如果是类的内部使用该类的内联函数,函数实现放哪都行(头文件和cpp文件都可以);但是如果外部调用类的内联函数同时该函数的实现又是放在cpp中,那会出现错误。同事于是问我会出现什么错误,当时我也没答上来。于是大家就先略过再去讨论其它方面。
我记得当年我还在CSDN上发过一个讨论的帖子,于是到网上搜索了一下,链接如下:
C++中的inline函数的实现部分应该放在哪里呢?
晚上回去写代码测试一下,如果把内联函数的实现放在cpp文件而外部又调用这个函数的话,确实会出现这个函数无法识别的错误。测试办法如下:
新建一个CTest类,在头文件这样声明:
class CTest { public: CTest(void); ~CTest(void); inline int GetValue(); };
在cpp文件这样实现:
#include "test.h" CTest::CTest(void) { } CTest::~CTest(void) { } inline int CTest::GetValue() { return 0; }
然后在main函数这样调用:
#include "test.h" int main( ) { CTest test; test.GetValue(); getchar(); }
不出意外的话应该会出现下面的链接错误:
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类的头文件。如下:
// test.h #pragma once class CTest { public: CTest(void); ~CTest(void); int GetValue() { return 0; } };
或者是这样:
// test.h #pragma once class CTest { public: CTest(void); ~CTest(void); int GetValue(); }; inline int CTest::GetValue() { return 0; }
《高质量C++编程》的作者林锐博士推荐后一种做法,认为后者是一种良好的编程风格。后来查了查《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译),里面给出的理论依据是:由于内联函数必须在调用它的每个文本文件中被定义,所以没有在类体中定义的内联成员函数必须被放在类定义出现的头文件中。
参考文献:
1. 《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译)。
2. 《高质量C++编程》,林锐著。
相关文章推荐
- 类的内联函数的实现应该放在哪里
- 类的内联函数的实现应该放在哪里
- C++中模板的声明和实现应该放在同一个文件中
- Xcode 里 用相对路径打开文件 文件应该放在哪里
- javascript应该放在哪里?
- classpath:applicationContext.xml这个xml文件应该放在哪里?
- 判断的标准应该放在哪里?
- 类属类的界面与实现应该放在同一个文件模块中
- Where-To-Put-The-Auto-Layout-Code(AutoLayout代码应该放在哪里?)
- 【翻译】我的业务逻辑应该放在哪里?
- inline, const, virtual, static四个关键字使用时应该放在哪里?
- 到底应该把网站放在哪里?
- SpringMVC——DispatcherServlet配置文件应该放在哪里?
- 打开或者创建数据库的操作应该放在哪里?
- DLL文件应该放在哪里?
- 应该把script标签放在哪里
- 前端-JS和CSS的引入/写入位置应该放在哪里?
- inline, const, virtual, static四个关键字使用时应该放在哪里
- XP系统缺少msxml4.dll文件,应该放在哪里?
- 业务逻辑应该在哪里实现更为合理呢?