我该如何在头文件中声明名称空间函数?
namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON
头应该只包含像类的头文件和实现应该是CPP文件函数定义,或者我应该马上实施的头文件的功能呢?
取决于您是否希望它们(可能)内联或导出。这通常归结为最小化依赖关系。
扩大出口上或内联:
你往往青睐的外部函数在C减少依赖++。这相当于从声明一个类的方法分离的定义:
file.hpp
namespace MON {
// extern:
t_ret func(const t_param& pValue);
} // << MON
file.cpp
#include "hefty_stuff.hpp"
MON::t_ret MON::func(const t_param& pValue) { ... }
但是
,它在时间的关键该定义在某些情况下是可见的,通常用于表现或者当您知道尺寸很重要并且标题不包括许多地方时。因此,inline
变体也是一种选择。
内联函数仍然可以导出,并且可以根据请求内联函数 - 但是,可以合并任何内联函数副本(具体而言,实现可以自由假定所有定义相同,并且该函数的任何副本都是不必要)。
与导出的定义,你可以选择性地限制(或隔离)的包括依赖关系。即#include "hefty_stuff.hpp"
不需要在标题中使用file.hpp
中的功能。
基本上,我试图实现应用程序解析包含一些命令的文本文件。所以我正在考虑实现静态帮助器方法来处理文本处理。
好吧,static
这里应该避免。 C++使用一个定义规则。 static
只会导致大量不必要的副本。此外,一个匿名的命名空间是C++的方式到C的static
功能:
namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon
注:匿名的命名空间也可能会造成不必要的副本。你将它们用作静态函数的替代品的原因是,如果你想要或需要偏离一个定义规则,并且不想在可能被“解析”的范围中声明该符号。
最后一点问候template<>
声明。使用模板时,除非编译器支持extern模板,否则该定义必须在使用位置可见。对于模板,您可以通过多种方式完成定义可视性。通常,人们只需简单地声明定义,或者为包含在标题末尾或根据需要的定义添加标题。使用模板,函数不需要声明为inline
以避免多重定义错误。
C++绘制函数和类之间存在相当明显的区别。从你的问题中不清楚你有兴趣使用哪一个。 – Shep
嗨谢,谢谢你的评论。我在我的问题中增加了更多细节。它回答你的问题吗? –