在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 ++代码编写的好习惯。而且,这种做法有什么不好的影响吗?谢谢!
答案 0 :(得分:4)
优良作法是在源文件中的匿名命名空间中定义helper_fun
。
像这样:
namespace {
void helper_fun()
{
//...
}
}
原因是如果在具有相同签名的另一个源文件中定义了另一个helper_fun
,则链接错误不会有任何风险。这并不是说会有,而是可能有一个。
此外,如果函数不会在相应的源文件之外使用,则不应将函数放在标题中。
答案 1 :(得分:2)
在源文件中使用本地帮助程序功能非常常见。通常它们被声明为static
(例如static void helper_fun() { }
)或匿名命名空间(例如namespace { void helper_fun() { } }
)。
将函数设置为静态或将它们放在匿名命名空间中是因为它们不能从外部调用,因此您可以拥有更多具有相同名称的本地函数。
但是,如果要从其他源文件调用该函数,则通常定义该函数,并在头文件中添加声明。
答案 2 :(得分:1)
如果您需要将其公开,并通过头文件包含在其他文件中。然后把它放在那里。
否则,它没有理由在标题中。
答案 3 :(得分:1)
如果您在标头中声明helper_fun
,则Myclass.h
的用户可以看到它。你想在其他地方使用helper_fun
吗?
只需将其保留在Myclass.cpp
内,您就可以确保它只能由Myclass.cpp
内的代码使用。
答案 4 :(得分:1)
当然.cpp文件中的声明函数是可以的。它是辅助函数,因此,您不应该向用户声明它。您可以使用匿名命名空间进行内部链接(默认情况下,函数具有外部链接)。
像这样直接或间接声明的未命名命名空间或命名空间 在未命名的命名空间内有内部链接。
namespace
{
// helper_fun has internal linkage.
void helper_fun()
{
}
}