命名空间和自由函数

ksl*_*ksl 3 c++ namespaces global-namespace non-member-functions

我有一个自由函数,foo在名称空间N中定义。的标头foo位于全局包含搜索路径中,因此任何人都可以通过包括来调用它foo.h

foo调用另一个本地自由函数foo1,该函数在中定义foo.cpp

// foo.h
namespace N
{
    void foo();
} 


// foo.cpp
#include "foo.h"

namespace
{
    // declare in the unnamed namespace?
    void foo1()
    {
        // do some stuff
    }
}

namespace N
{
    // declare in namespace N?
    void foo1()
    {
        // do some stuff
    }

    void foo()
    {
        foo1();
    }

} // N
Run Code Online (Sandbox Code Playgroud)

我应该放入foo1未命名的名称空间还是namespace N?还是没关系?

更新

我想将范围限制foo1foo.cpp

Luc*_*ore 5

那不是全局名称空间,而是匿名名称空间。在此处定义它只能foo1在该翻译单元中使用,因此您不能在其他地方声明它并随后使用它。

这将有效地将其范围限制为foo.cpp。如果您打算这样做,请在匿名名称空间中声明它。

如果您希望能够从外部使用它,请在全局命名空间中声明它N(或(全局命名空间意味着您只是将其保留在命名空间之外))-视其合理性而定。

void global_foo();

namespace
{
   void internal_linkage_foo();
}

namespace X
{
   void foo_from_x();
}
Run Code Online (Sandbox Code Playgroud)

  • @ksl [一个定义规则](http://en.wikipedia.org/wiki/One_Definition_Rule) 规定您只能为特定函数定义一个定义。如果你把 `foo1` 放在命名空间 `N` 中,而其他人也试图把一个函数 `foo1` 放在命名空间 `N` 中,你会得到一个链接器错误。即使这些函数没有在 .h 文件中声明。通过将它放在匿名命名空间中,您可以确保不会遇到任何冲突。 (2认同)