我应该如何在头文件中声明命名空间函数?
namespace MON {
t_ret func(const t_param& pValue);
inline t_ret inline_func(const t_param& pValue) { ... }
}
应该根据是否需要内联或导出函数来确定头文件中是否只包含函数定义,类似于类头文件和实现应该在cpp文件中,还是直接在头文件中实现函数。这通常取决于最小化依赖关系。
要详细说明导出或内联内容:
在C++中,您通常会选择使用外部函数来最小化依赖关系。这相当于将类方法的定义与声明分开:
file.hppnamespace MON {
t_ret func(const t_param& pValue);
}
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<>
声明的最后一点。对于模板,定义必须在使用处可见,除非您的编译器支持外部模板。对于模板,您可以通过多种方式实现定义的可见性。通常,人们会直接在原地声明定义,或者添加一个包含定义的头文件,该头文件要么在头文件的末尾被包含,要么根据需要被包含。对于模板,函数不需要声明为
inline
以避免多次定义错误。