C++命名空间(名字空间)详解

20次阅读
2 条评论

共计 1680 个字符,预计需要花费 5 分钟才能阅读完成。

一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。

例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义(Redefinition)错误。

为了解决合作开发时的命名冲突问题,C++ 引入了 命名空间(Namespace)的概念。请看下面的例子:

namespace Li{  // 小李的变量定义
    FILE* fp = NULL;
}
namespace Han{  // 小韩的变量定义
    FILE* fp = NULL;
}

小李与小韩各自定义了以自己姓氏为名的命名空间,此时再将他们的 fp 变量放在一起编译就不会有任何问题。

命名空间有时也被称为名字空间、名称空间。

namespace 是 C ++ 中的关键字,用来定义一个命名空间,语法格式为:

namespace name {//variables, functions, classes}name

是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由 {} 包围。

使用变量、函数时要指明它们所在的命名空间。以上面的 fp 变量为例,可以这样来使用:

Li::fp = fopen("one.txt", "r");  // 使用小李定义的变量 
fpHan::fp = fopen("two.txt", "rb+"); // 使用小韩定义的变量 fp

::是一个新符号,称为域解析操作符,在 C ++ 中用来指明要使用的命名空间。

除了直接使用域解析操作符,还可以采用 using 关键字声明,例如:

using Li::fp;
fp = fopen("one.txt", "r");  // 使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+");  // 使用小韩定义的变量 fp

在代码的开头用 using 声明了  Li::fp,它的意思是,using 声明以后的程序中如果出现了未指明命名空间的 fp,就使用 Li::fp;但是若要使用小韩定义的 fp,仍然需要 Han::fp。

using 声明不仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:

using namespace Li;
fp = fopen("one.txt", "r");  // 使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+");  // 使用小韩定义的变量 fp

如果命名空间 Li 中还定义了其他的变量,那么同样具有 fp 变量的效果。在 using 声明后,如果有未具体指定命名空间的变量产生了命名冲突,那么默认采用命名空间 Li 中的变量。

命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的名称,同样也都能在命名空间内部进行声明或定义,例如类、函数、typedef、#define 等都可以出现在命名空间中。

站在编译和链接的角度,代码中出现的变量名、函数名、类名等都是一种符号(Symbol)。有的符号可以指代一个内存位置,例如变量名、函数名;有的符号仅仅是一个新的名称,例如 typedef 定义的类型别名。

下面来看一个命名空间完整示例代码:

#include <stdio.h>

// 将类定义在命名空间中
namespace Diy{
    class Student{
    public:
        char *name;
        int age;
        float score;
  
    public:
        void say(){printf("%s 的年龄是 %d,成绩是 %f\n", name, age, score);
        }
    };
}

int main(){
    Diy::Student stu1;
    stu1.name = "小明";
    stu1.age = 15;
    stu1.score = 92.5f;
    stu1.say();

    return 0;
}

运行结果:
小明的年龄是 15,成绩是 92.500000

C++ 命名空间的语法比较复杂,本节所讲到的只是冰山一角,主要是为下节《C++ 头文件和 std 命名空间》的讲解打基础。关于命名空间的更多内容我们将在后续章节中一一讲解。

正文完
 0
评论(2 条评论)
验证码
arionplay 评论达人 LV.1
2025-11-27 00:41:06 回复

Blackjack strategy is fascinating – understanding those odds really changes the game! Seeing platforms like arion play app prioritize secure, regulated play is a big plus for new players learning the ropes, and responsible gaming is key!

 Windows  Firefox  中国香港香港宽频
phdream8 评论达人 LV.1
2026-05-27 13:08:26 回复

Phdream8 is pretty decent. I signed up last week and have to say that the site is pretty easy to use. Check it out to see more! More info about them here phdream8.

 Linux  Chrome  中国香港