【发布时间】:2010-12-21 01:09:31
【问题描述】:
我想知道仅在头文件中声明和实现类与在头文件中对类进行原型化并在有效的 .cpp 文件中实现的常规方法相比有哪些区别。
为了更好地解释我在说什么,我指的是正常方法之间的差异:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...);
void method2(...);
...
};
//file class.cpp
#include "class.h"
void MyClass::method1(...)
{
//implementation
}
void MyClass::method2(...)
{
//implementation
}
和 just-header 方法:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...)
{
//implementation
}
void method2(...)
{
//implementation
}
...
};
我可以得到主要区别:在第二种情况下,代码包含在需要它生成相同实现的更多实例的每个其他文件中,因此是隐式冗余;而在第一种情况下,代码是自行编译的,然后每个引用MyClass 对象的调用都链接到class.cpp 中的实现。
但是还有其他区别吗?根据情况使用一种方法而不是另一种方法是否更方便?我还在某处读到,将方法的主体直接定义到头文件中是对编译器的内联该方法的隐式请求,是真的吗?
【问题讨论】:
-
如果你有适当的预处理器保护,它不会创建更多相同实现的实例。
-
你是在说#ifndef CLASS_H #define CLASS_H 等吗?
-
@Andrew:当然会,如果两个 .cpp 文件都包含相同的头文件,那么无论任何预处理器保护如何,每个文件都将完整编译其内容,并且编译后的内容将出现在输出中目标文件。重复项只会由链接器删除。预处理器守卫将优雅地处理单个翻译单元对标头的双重包含,而不是在翻译单元之间共享。
-
好的,所以它按我的想法工作。使用#define 将避免仅在同一翻译单元内重复定义..