C++命名空间和别名

命名空间和别名

命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

namespace Jack{
    double pail;
    void fetch;
    int pal;
    struct Well{...};
}
namespace Jill{
    double bucket(double n){ ... }
    double fetch;
    int pal;
    struct Hill{ ... };
}

命名空间可以定义变量,函数,类型.

可以嵌套,可以命名同样名称的命名空间,但是最后会合并成同一个.

名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)。
除了用户定义的名称空间外,还存在另一个名称空间一全局名称空间(global namespace)。它对应于文件级声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。

通过这样的方式可以区别不同命名空间的变量和函数,只需使用::表示就行了,等于围了一座墙,只有钥匙才能开,这就能解释为什么在函数中使用::可以改为同名的全局变量,因为前面的空白,等于全域.

现在该如何访问命名空间域里的内容呢?其实有3种方法:

  1. 加命名空间名称及作用域限定符“::
  2. 使用using namespace 命名空间名称全部展开
  3. 使用using将命名空间中成员部分展开

主要讲讲第三点:

void a(){
    using std::cout;
    cout << 1;
}
int main(){
    a();//cout可以
    cout << 1;//cout不可以
}

namespace也可以匿名定义,其潜在作用域为声明点到声明区域末尾.

using 别名

在C++11 使用 using 引入了下面这种形式的写法(模板也可以使用别名了),并且同时支持对传统 typedef 相同的功效:

通常我们使用 typedef 定义别名的语法是:typedef 原名称 新名称;,但是对函数指针等别名的定义语法却不相同,这通常给直接阅读造成了一定程度的困难。

typedef int (*process)(void *);//定义了一个函数指针类型process
using NewProcess = int(*)(void *);//定义了一个函数指针类型NewProcess
template<typename T>
using TrueDarkMagic = MagicType<std::vector<T>, std::string>;

int main() {
    TrueDarkMagic<bool> you;
}

故而在技术层面,using相较typedef有优越性.

posted @ 2025-08-30 13:49  T0fV404  阅读(8)  评论(0)    收藏  举报