我应该在实现文件中使用未命名的命名空间吗?

问题描述 投票:5回答:3

我在外部* .cpp文件中定义了一些函数(这里没有涉及的类),当然还有一个合适的* .h文件。

* .cpp文件中的某些函数仅用于其他地方的* .cpp文件中。 * .h文件中甚至没有提到它们。

我应该将这些函数放入一个未命名的命名空间中,还是只能放在其他函数旁边?如果是这样,为什么我需要一个未命名的命名空间呢?我无法看到问题,因为无论如何都无法从外部访问这些功能。

c++ file namespaces implementation
3个回答
15
投票

如果您希望它们真正属于该编译单元,请将它们放在匿名命名空间中。如果你不这样做,那么有人可以在其他地方声明这些功能并明确地使用它们。

请看以下示例:

// 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;
}

4
投票

您的问题可分为两部分:

1.“我怎样才能隐藏全局功能?”

一种简单的方法是,不要将函数的头部放入头文件中:

//============================
// 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 ++”编译器都可以这样工作。

还有其他方法,请阅读下一节。

“是匿名命名空间,隐藏全局功能的好方法吗?”

“匿名命名空间”技术是另一种隐藏全局功能的方法。

有一个类似的问题:

Unnamed/anonymous namespaces vs. static functions

但是,就个人而言,我不推荐这种技术,作为“最喜欢的”答案。

命名空间是其中之一,我希望自“纯c”或“c ++”开始以来就存在。但是,“匿名命名空间”或“未命名的命名空间”似乎很奇怪。

它就像试图隐藏某些东西,然后忘记,你在哪里储存它。

3其他建议

(a)我建议每个文件使用一个主要的REQUIRED,而不是可选的非匿名命名空间。它可能有嵌套的额外内部命名空间。每个主命名空间应该具有相同的id。作为文件名,但是,没有文件扩展名或文件后缀。

(b)避免使用匿名名称空间。它就像把东西存放在仓库里,没有索引。

(c)在头文件中使用文件扩展名或文件前缀,可能是“.h”或“.hpp”,即使它是一个c ++文件。标准说c ++不应该在“c ++”文件上使用文件扩展名或文件后缀,但很难在文件系统上识别或查找。

祝好运。


1
投票

我想如果你不希望从外面看到这些函数,则将它们声明为static

© www.soinside.com 2019 - 2024. All rights reserved.