c++的命名空间

namespace(命名空间/名字空间)

因为在C++中只有一个全局作用域,所以标识符之间可能发生冲突。

因此C++中提出了命名空间的概念:
命名空间将全局作用域分成不同的部分;不同命名空间中的标识符可以同名而不会发生冲突,当然命名空间可以发生嵌套;
此外,全局作用域是默认命名空间。

C++命名空间的使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable
使用默认命名空间中的变量:  ::variable

Example: 

#include <stdio.h>
#include <iostream>
namespace First
{
int i = 0;
}

namespace Second
{
int i = 1;
namespace Internal //嵌套命名空间
{
struct P //嵌套命名空间
{
    int x;
    int y;
};
} // namespace Internal
} // namespace Second

int main()
{
    using namespace First;       //使用整个命名空间
    using Second::Internal::P; //使用嵌套的命名空间

    printf("First::i = %d\n", i);
    printf("Second::i = %d\n", Second::i); //使用命名空间中的变量

    P p = {2, 3};

    printf("p.x = %d\n", p.x);
    printf("p.y = %d\n", p.y);

    system("pause");
    return 0;
}

编译运行,输出结果:

可以使用using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称。

#include <iostream>
using namespace std;

// first name space
namespace first_space
{
void func()
{
    cout << "Inside first_space" << endl;
}
} // namespace first_space

// second name space
namespace second_space
{
void func()
{
    cout << "Inside second_space" << endl;
}
} // namespace second_space

using namespace first_space;
int main()
{
    // This calls function from first name space.
    func();
return 0; }

编译运行,输出结果:

#define 、 typedef 和 using

#define

#define是一个预处理指示符

用来定义“宏”。编译器不做类型检查

语法:#define   MACRONAME     Something

#define TRUE 1 //结尾无分号,宏名为TRUE

 

typedef

创建能在任何位置替代类型名的别名

语法:typedef   Some Type    NewTypeName

tpedef_ Bool bool; //C99中 没有bool关键字,所以<stdbool.h>中这样定义出一个

 

using
//类型别名,等同于typedef unsigned int UInt;
using UInt = unsigned int;
// 名称'UInt' 现在指代类型:
UInt x = 42u;

//类型别名,等同于typedef void (*FuncType)(int, int);
using FuncType = void (*) (int, int);
//名称'FuncType' 现在指代指向函数的指针:
void example(int, int) {}
FuncType f = example;

语法:using identifier = type-id

 

posted @ 2020-05-16 14:25  我等着你  阅读(267)  评论(0)    收藏  举报