在 C++ (class) 中,我总是需要在头文件中声明函数吗?

In C++ (class), do I always need to declare function in the header file?

例如,我有一个 markerdisplay.cpp 文件。 markerdisplay 成员函数将类似于下面的代码。

void MarkerDisplay::setMarkerStatus(MarkerID id, StatusLevel level, const std::string& text)
        {
               .....
        }

我可以在 markerdisplay.cpp 中使用非成员函数吗?

例如,

bool validateFloats(const visualization_msgs::Marker& msg)
        {
              ...
        }

函数validateFloats不是成员函数,我也没有在头文件中声明。我只在 validateFloats.cpp 文件中使用这个函数。

有人告诉我这可能会导致一些问题。是真的吗?

如果您不需要 .cpp 之外的函数,在该文件中声明和定义它就足够了。当然你仍然需要在第一次使用之前声明它,但这是我唯一能想到的"problem"。

如果不需要的话,不要在header中声明函数是个好主意,因为你使用更少的"project-public"名称并创建它更容易找到函数的所有用途,从而使代码更易于维护。

如果您没有在 header 中声明该函数,您应该声明它 static

static bool validateFloats(const visualization_msgs::Marker& msg);

或者放在匿名命名空间中:

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg);
}

(首选)以避免意外的 cross-translation-unit 名称冲突。

my question is: can I have non member function in the markerdisplay.cpp for example ...

是的,你可以做到。

最好的选择是在实现翻译单元中提供该功能,如果它不打算在 public API.

中使用的话

您甚至可以在匿名命名空间中完全隐藏它(包括链接器)

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg) {
       // ...
    }
}

或者在翻译单元中定义一个 static 函数应该有同样的效果:

static bool validateFloats(const visualization_msgs::Marker& msg) {
   // ...
}