第三章、名字空间

在 C 语言中,当多人合作开发一个项目是难免会出现名字冲突问题,如:张三写了一个文件 a.c,内部定义了一个全局变量 int count = 100;,同时李四写了一个文件 b.c,内部也定义了一个全局变量 int count = 200;,因为 C 语言中全局变量的名称是全局可见,因此在编译上述两个 .c 文件时并不会出错,但在链接阶段就会报错,提示类似于:重复定义 这类的错误。

张三写的 a.c

int count = 100;

李四写的 b.c

int count = 200;

如果要解决上述错误,我们可以让其中的一个全局变量 count 变为当前模块文件(.c)文件内可见即可。如,将李四定义的变量countstatic 关键字修饰即可。修改如下:

李四写的 b.c 修改如下:

static int count = 200;

这样在程序链接阶段就不会出现错误了。这样虽然解决了当前名字冲突问题,但当王五、赵六参加到项目组的时候,又可能会出现名字冲突问题。

C++ 语言中给出了命名空间(namespace )的概念,他使用 namespace 关键字,将多个同名的变量、函数、类或模板定义在不同的名字空间中,在使用时名明确指定名字空间即可。例如开始的 hello.cpp 程序中的 std::coutstd::endl,就是 std 名字空间中的两个变量。

1. 命名空间定义

在现实世界中,名字叫 魏明择 的人可能有很多。比如我是那个在北京市朝阳区的魏明择,清华大学机电系还有一个魏明择,中科院研究所里还有一个魏明择。那如何区分这三个人呢?比如一个美女邮寄一本书给魏明择,那么该怎样指定这三个人中的一个呢?当然要在名字的前面加上定义,如 北京市朝阳区的 魏明择,这个北京市朝阳区就是一个名字空间。现实当中不同的名字空间内可以有多个不同名称的人而不会出现名字冲突。

在 C++ 语言中,每个人写的变量和函数等可以在自己的名字空间中。名字空间用自己的名字,其中可以放入多个不同明的变量、函数、类或模板。

名字空间也叫命名空间,是一个标识符的范围空间。

下面我们来看一个定义名字空间的语法:

语法:

namespace 命名空间名 {
   // 此处定义此空间内的变量和函数、类等。
}  // 注意:此处没有分号。

注:名字空间名必须是标识符

示例:

在不同名字空间内定义名字为 mystr 的字符型指针和名字为 say_hello 的函数。

定义 englishi_env 名字空间来存放在英文环境下运行的数据和函数。

// 定义英文运行环境的名字空间
namespace english_env {
    const char * mystr = "Hello";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

定义 chinese_env 名字空间来存放在中文环境下运行的数据和函数。

// 定义中文运行环境的名字空间
namespace chinese_env {
    const char * mystr = "你好";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

这样我们就定义个两个可用的名字空间 english_envchinese_env

完整代码如下:

#include <iostream>

// 定义英文运行环境的名字空间
namespace english_env {
    const char * mystr = "Hello";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

// 定义中文运行环境的名字空间
namespace chinese_env {
    const char * mystr = "你好";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

int main(int argc, char * argv[]) {
    return 0;
}

实验

编译并运行上述代码,看是否能够正确编译。

此程序没有任何打印输出。