命名空间(C++11~C++20)

命名空间使用的一些注意点

a. 一个命名空间可以定义在全局作用域内,也可以定义在其他命名空间内部(嵌套),但不能定义在函
数或类的内部。

b. 可以将已经存在的名字空间定义别名,格式为:namespace new_name = current_name。

c. 全局命名空间:定义在全局作用域中的名字也是定义在全局命名空间中的;全局命名空间是隐式声
明的,每个文件都将全局作用域内定义的名字添加到全局命名空间中。可以直接使用作用域操作符访问
全局命名空间中的成员(::member_name)。

d. using声明:一条using声明语句用来引用命名空间中的一个成员。使用using声明引入的名字的作用
域从声明的地方开始,直到using声明所在的作用域结束处为止。例如,使用using声明引入标准库命名空
间std中的成员cout:
    using std::cout;    //此声明告诉编译器后续cout属于命名空间std
    cout << "Hello C++";    //cout等价于std::cout;

e. using指示: using声明一次只能引入命名空间的一个成员,如果要引入一个命名空间内所有的成员,
则可以使用using指示(使用using指示引入的名字的作用域和使用using声明引入的名字的作用域规则一
致:从声明的地方开始,直到using语句所在的作用域结束为止)。例如,引入标准库命名空间std中的所
有成员:
    using namespace std;

内联命名空间(C++11)

        C++11标准新增内联命名空间(inline namespace):内联命名空间中的函数和类型可以在外层命名空间中直接使用。内联命名空间中的声明看起来就好像是直接在外围的命名空间中进行声明的一样。

/*通常情况下,当一个程序的新版本发布时可以使用内联命名空间,让客户可以不修改任何代码也能
自由选择新老代码库。假设之前的Parent库代码的的代码只有fun一个函数,突然某天需要升级接口,
而有些用户又不愿意为了新接口去修改它们的代码,还有部分用户不希望升级仍使用旧代码。这时比较
简单的办法就是使用内联命名空间,将不同版本的接口归纳到不同的命名空间中(定义一个命名空间
FirstVersion存放老代码,定义一个内联命名空间SecondVersion存放新增代码)。*/
#include
namespace Parent {
    namespace FirstVersion {
        void fun() {std::cout << "FirstVersion" << endl;}
    }

    inline namespace SecondVersion {
        void fun() {std::cout << "SecondVersion" << endl;}
    }
}
/*虽然fun函数从FirstVersion升级到了SecondVersion,但是客户的代码并不需要任何修改。如果还
想使用老的FirstVersion里的函数,只需要统一添加函数版本的命名空间Parent::FirstVersion::fun()*/
void main()
{
    Parent::fun();
}

嵌套命名空间的简化

        在C++17标准中允许使用一种更简洁的形式描述命名空间,例如:

namespace A::B::C {
    int foo() {return 5;}
}

/*以上代码等价于:*/
namespace A {
    namespace B {
        namespace C {
            int foo() {return 5;}
        }        
    }
}

        令人遗憾的是在C++17中并没有办法简洁地定义内联命名空间,这个办法直到C++20标准才得到解决。在C++20中,可以按如下方式简化定义,需要注意的是inline可以出现在除第一个namespace之外的任意namespace之前。

/*示例1*/
namespace A::B::inline C {
    int foo() {return 5;}
}
//它等价于:
namespace A::B {
    inline namespace C {
        int foo() {return 5;}
    }
}

/*示例2*/
namespace A::inline B::C {
    int foo() {return 5;}
}
//它等价于:
namespace A {
    inline namespace B {
        namespace C {
            int foo() {return 5;}
        }
    }
}

你可能感兴趣的:(C++,C++)