用于定义全局函数"using namespace"

"using namespace" for defining global functions

本文关键字:using namespace 函数 定义 全局 用于      更新时间:2023-10-16

在源文件中定义类成员函数时,我们可以使用using namespace ns1::ns2::...::nsx来避免必须完全限定函数名称。

例如

// Header file - foo.hpp
namespace ns1::ns2 {
    class FooClass {
        void fooMethod();
    }
}
// Source file - foo.cpp
#include "foo.hpp"
using namespace ns1::ns2;
void FooClass::fooMethod() {
    // do something
}

但是,我最近在尝试定义全局函数时遇到了困惑。

请参阅以下示例。

// Header file - bar.hpp
namespace ns1::ns2{
    void barFunction();  // <-- compile error: undefined reference
}
// Source file - bar.cpp
#include "bar.hpp"
using namespace ns1::ns2;
void barFunction(){
    // do something
}

我期望编译器将bar.cpp中的定义推导出为bar.hpp中定义的ns1::ns2::barFunction的定义。但它没有这样做。(如果我在定义中使用完全限定的名称,一切正常(。

这是预期的行为还是我做错了什么?

这是

预期行为。

[命名空间.udir]

3 using-指令不会向声明性添加任何成员 它出现的区域。

这意味着在定义全局命名空间

时,全局命名空间中没有 barFunction 的声明。这使得该定义成为此类函数的第一个也是唯一一个声明(在全局命名空间中(。

这是设计使然,因为 using 指令通常可以引入比预期更多的名称。因此,不让它践踏它出现的声明性区域是好的。