在 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) {
// ...
}
例如,我有一个 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) {
// ...
}