1

如何在一个 cpp/hpp 文件中创建一堆不依赖于任何对象的方法(在我的文件中没有类、没有对象、没有 main,只有方法)以及如何声明它们?

4

6 回答 6

4

创建一个namespace. 像这样的东西:

实用程序.h

namespace Utils
{
   void myMethod();
}

实用程序.cpp

namespace Utils
{
  void myMethod()
  {
    //Implementation
  }
}
于 2012-05-03T17:00:32.240 回答
2

如果您希望它们是公开的,即在多个翻译单元中可用,最好的方法是将它们包含在 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() {}
}
于 2012-05-03T17:00:26.850 回答
1

要定义不依赖于对象的函数,只需直接声明它们即可。

// 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;
}
于 2012-05-03T17:00:51.810 回答
1

你声明它们的方式与在C. 它可以在命名空间内或命名空间外。除了他们不在一个班级之外,没有什么区别。

如果你想在C以后使用这些函数,你应该在它们前面加上extern "C".

extern "C" void foo();

于 2012-05-03T17:01:02.163 回答
1

没有什么能阻止你编写自由函数。如果你认为一个函数应该是全局的,那么自由函数是非常合适的。

于 2012-05-03T17:03:49.567 回答
1

您应该将它们放在命名空间中。Naveen 的例子很恰当。

作为附加说明,如果您希望在命名空间中隐藏某些函数或数据单元(从而模仿“私有”访问),请将这些函数和数据单元放置在匿名命名空间中,嵌套在父命名空间中。例如:

namespace Foo
{
    publicFunction1();
    publicFunction2();

    namespace
    {
        privateFunction1();
        std::vector<Bar> privateData;
    }
}

嵌套的匿名命名空间内的项目只能由父命名空间内的项目访问。我发现这非常有用。

于 2012-05-03T17:05:04.677 回答