我在外部* .cpp文件中定义了一些函数(这里没有涉及的类),当然还有一个合适的* .h文件。
* .cpp文件中的某些功能仅在其他地方的* .cpp文件中仅使用 。它们甚至没有在* .h文件中提及。
我应该将这些函数放入一个未命名的命名空间中,还是只能放在其他函数旁边?如果是这样,为什么我需要一个未命名的命名空间呢?我无法看到问题,因为无论如何都无法从外部访问这些功能。
答案 0 :(得分:13)
如果您希望它们真正属于该编译单元,请将它们放在匿名命名空间中。如果你没有,那么有人可以在其他地方声明这些功能并明确使用它们。
采用以下示例:
// library.cpp
// a "private" function here, in that it is not declared anywhere
void f() {}
namespace
{
// same as above, except within an anonymous namespace
void g() {}
}
// client.cpp
void f();
int main()
{
// Can call f(), it's been declared and is now effectively "public"
f();
// compilation error, this has no idea what g() is, it's not declared
// in any scope that can be resolved here
g();
return 0;
}
答案 1 :(得分:4)
您的问题可分为两部分:
<强> 1。 “我怎样才能隐藏全局功能?”
一种简单的方法是 NOT 将函数的标题放入头文件中:
//============================
// Filename: "mylibrary.hpp"
//============================
// Description:
// Utility functions.
//============================
#ifndef MYLIBRARY_H_INCLUDED
#define MYLIBRARY_H_INCLUDED
//============================
namespace MyLibrary
{
void DoSomething();
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
完整代码文件:
//============================
// Filename: "mylibrary.cpp"
//============================
// Description:
// Utility functions.
//============================
// self header include
#include "mylibrary.hpp"
//============================
namespace MyLibrary
{
void DoSomethingBefore()
{
// ...
}
void DoSomethingAfter()
{
// ...
}
void DoSomethingConfirmed()
{
// ...
}
void DoSomething()
{
DoSomethingBefore();
DoSomethingConfirmed();
DoSomethingAfter();
}
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
编译时,会出现“mylibrary.o”或“mylibrary.obj”文件。您可以将其提供给其他开发人员:“mylibrary.hpp”加上“mylibrary.obj”,但是没有“mylibrary.cpp”文件。大多数“普通c”/“c ++”编译器都可以这样工作。
还有其他方法,请阅读下一节。
<强> 2。 “是匿名命名空间,隐藏全局功能的好方法吗?”
“匿名命名空间”技术是隐藏全局函数的另一种方法。
有一个类似的问题:
Unnamed/anonymous namespaces vs. static functions
但是,就个人而言,我不推荐这种技术,作为“最喜欢的”答案。
命名空间是其中之一,我希望自“纯c”或“c ++”开始以来就存在。但是,“匿名命名空间”或“未命名的命名空间”似乎很奇怪。
它就像试图隐藏某些东西,然后忘记了,你在哪里储存它。
3其他建议
(a)我建议每个文件使用一个主 REQUIRED ,而不是可选的非匿名命名空间。它可能有嵌套的额外内部命名空间。每个主命名空间应该具有相同的id。作为文件名,但没有文件扩展名或文件后缀。
(b)避免匿名命名空间。它就像把东西存放在仓库里,没有索引。
(c)在头文件中使用文件扩展名或文件前缀,可能是“.h”或“.hpp”,即使它是c ++文件也是如此。标准说c ++不应该在“c ++”文件上使用文件扩展名或文件后缀,但很难在文件系统上识别或查找。
祝你好运。
答案 2 :(得分:1)
我想如果您不希望从外部看到这些函数,请将它们声明为static
。