0

在 C++ 定义文件 (.cpp) 中,有时我可以定义要调用的小函数,例如:

// Class declaration 
// Myclass.h
Class Myclass
{
...
  void Classfunction();
...
}
// Class defination 
// Myclass.cpp
#include "Myclass.h"
...
void helper_fun()
{
 ...
}
...
void Myclass::Classfunction()
{
...
  helper_fun();
...
}

在上面的示例中,我们可以看到 void helper_fun() 在 .cpp 文件中声明和定义。此函数的目的是由已在类中定义的函数调用。当然,helper_fun 可以先在头文件中声明,再在实现文件中定义。我的问题是这是否是 C++ 代码编写的好习惯。而且,这种做法会不会有一些不好的影响?谢谢!

4

5 回答 5

4

helper_fun在源文件中的匿名命名空间中定义是一个好习惯。

像这样:

namespace {
    void helper_fun()
    {
        //...
    }
}

原因是,如果helper_fun在另一个具有相同签名的源文件中定义了另一个,则链接错误不会有任何风险。这并不是说会有,而是可能会有一个。

此外,如果函数不会在相应的源文件之外使用,则不应将函数放在头文件中。

于 2012-07-31T11:19:06.357 回答
2

在源文件中有本地帮助函数是很常见的。通常它们被声明为static(例如static void helper_fun() { })或在匿名名称空间中(例如namespace { void helper_fun() { } })。

将函数设为静态或将它们放在匿名命名空间中是为了使它们无法从外部调用,这样您就可以拥有更多同名的本地函数。

但是,如果您想从其他源文件调用该函数,则正常定义该函数,并在头文件中添加声明。

于 2012-07-31T11:21:35.597 回答
1

如果您需要将其公开,并通过头文件包含在其他文件中。然后放在那里。

否则没有理由让它出现在标题中。

于 2012-07-31T11:17:54.623 回答
1

如果您helper_fun在标头中声明,它将对Myclass.h. 你想helper_fun在其他地方使用吗?

通过将其单独保存在Myclass.cpp您确保它只能由Myclass.cpp.

于 2012-07-31T11:19:15.917 回答
1

当然在 .cpp 文件中声明函数是可以的。它是辅助函数,所以你不应该把它的声明给用户。您可以使用匿名命名空间进行内部链接(默认情况下,函数具有外部链接)。

未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。

像这样

namespace
{
// helper_fun has internal linkage.
void helper_fun()
{
}

}
于 2012-07-31T11:20:07.197 回答