在h文件上内联发布版本并在cpp上实现调试版本的函数
Function having release version inline on h file and debug version implemented on cpp
我正在维护一个遗留的MFC应用程序,我看到的模式与Windows书下的面向对象编程模式完全相同,其中相关部分是:
佩尔维尤·
#ifndef _DEBUG // debug version in persview.cpp
inline CPersDoc* CPersView::GetDocument()
{ return (CPersDoc*)m_pDocument; }
#endif
佩尔维尤.cpp
#ifdef _DEBUG
CPersDoc* CPersView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPersView)));
return (CPersView*)m_pDocument;
}
#endif //_DEBUG
如果我在 Internet 上搜索它,我会看到该模式被广泛应用,因此我认为它是向导生成的代码。
我的问题是:发布版本内联在 .h 文件上并在 .cpp 文件上进行调试是否有任何优势或其他充分的理由?为什么不将两者放在同一个文件上,彼此相邻?
请注意,您引用的书是1994年出版的。当时C++非常不同,Microsoft的C++编译器则不是。猜测,inline
当时有不同的语义,并指示编译器内联函数调用,即使在调试配置中也是如此。
除此之外,还有技术原因:编译器只有在看到完整定义的情况下才能内联函数。如果希望它内联在不同的编译单元中,则函数定义需要位于头文件中。另一方面,不能将非内联函数放在标头中,因为如果标头包含在多个编译单元中,这将违反一个定义规则。在这种情况下,您会收到链接器错误。
如果您希望摆脱代码重复并仍然获得相同的好处,您可以:只需将调试版本移动到标头中,将其标记为inline
,然后删除预处理器条件。ASSERT
在非调试配置中编译为无,编译器可以(可能(内联函数调用。对于调试配置,编译器不会执行任何优化,而是发出函数调用的代码。函数调用在调试配置中是可取的,因为它们会产生更有意义的堆栈跟踪。
对于非调试构建,优点是头文件恰好是inline
函数定义所属的位置,因此多个#include
只能看到它的一个定义。
对于函数未内联的调试版本,优点是您可以保持声明和定义的约定是分开的 - 定义是您希望找到它的位置。
即您不会将它们放在头文件中,因为这在不inline
时是意外的,并且您不会将它们放在源文件中,因为当它inline
时会出错。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- Linux的Cpp上的计时器
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 命名空间中具有.h和.cpp文件的类
- 内置函数可查看CPP中的成员变量
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- Cpp-Tuple使用带有变量的get
- 导入库可以跨dll版本工作吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 在 cpp 自己的版本中对字符串进行哈希处理
- 在h文件上内联发布版本并在cpp上实现调试版本的函数
- 如何在yaml-cpp中写一个版本字符串作为文字(不是字符串)
- 如何在CPP中获得当前版本的Visual Studio进行扩展项目
- C/CPP 宏或预处理器,用于处理方法的多个版本
- BeautifulSoup的C / CPP版本,特别是在处理格式错误的HTML方面
- 如何在TFS 2012更新1版本中构建CPP项目
- 构建运行在不同版本linux上的cpp程序