如何在一个 cpp/hpp 文件中创建一堆不依赖于任何对象的方法(在我的文件中没有类、没有对象、没有 main,只有方法)以及如何声明它们?
6 回答
创建一个namespace
. 像这样的东西:
实用程序.h
namespace Utils
{
void myMethod();
}
实用程序.cpp
namespace Utils
{
void myMethod()
{
//Implementation
}
}
如果您希望它们是公开的,即在多个翻译单元中可用,最好的方法是将它们包含在 anamespace
中,在标头中声明它们并在单个实现文件中实现它们:
//functions.h
namespace MyFunctions
{
void foo();
void goo();
}
//functions.cpp
namespace MyFunctions
{
void foo() {}
void goo() {}
}
重要的
如果您在标头中提供定义,则应标记它们inline
,否则在多个翻译单元中包含该标头可能会导致链接器错误:
//functions.h
inline void foo() {
//..
}
inline void goo() {
//..
}
如果您只希望它们在翻译单元中可用,请在匿名命名空间中的该实现文件中定义它们(或声明它们static
):
//fileThatUsesFunctions.cpp
namespace
{
void foo() {}
void goo() {}
}
要定义不依赖于对象的函数,只需直接声明它们即可。
// MyFile.h
int some_function();
// MyFile.cpp
int some_function() {
return 42;
}
使用 C++ 虽然在命名空间中声明它们是个好主意。这不会使他们依赖于对象,但确实减少了全局命名空间污染
// MyFile.h
namespace MyNamespace {
int some_function();
}
// MyFile.cpp
using MyNamespace;
int some_function() {
return 42;
}
你声明它们的方式与在C
. 它可以在命名空间内或命名空间外。除了他们不在一个班级之外,没有什么区别。
如果你想在C
以后使用这些函数,你应该在它们前面加上extern "C"
.
extern "C" void foo();
没有什么能阻止你编写自由函数。如果你认为一个函数应该是全局的,那么自由函数是非常合适的。
您应该将它们放在命名空间中。Naveen 的例子很恰当。
作为附加说明,如果您希望在命名空间中隐藏某些函数或数据单元(从而模仿“私有”访问),请将这些函数和数据单元放置在匿名命名空间中,嵌套在父命名空间中。例如:
namespace Foo
{
publicFunction1();
publicFunction2();
namespace
{
privateFunction1();
std::vector<Bar> privateData;
}
}
嵌套的匿名命名空间内的项目只能由父命名空间内的项目访问。我发现这非常有用。