C++入门篇——命名空间

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

#include <stdio.h>
#include <stdlib.h>

int rand = 10;

// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}

// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

1. 命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。

// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。
// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs
// 1. 正常的命名空间定义
namespace bit
{
    // 命名空间中可以定义变量/函数/类型
    int rand = 10;
    int Add(int left, int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}

//2. 命名空间可以嵌套
// test.cpp
namespace N1
{
    int a;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }
    namespace N2
    {
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
    int Mul(int left, int right)
    {
        return left * right;
    }
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2. 命名空间使用

namespace bit
{
// 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;

    int Add(int left, int right)
    {
        return left + right;
    }

    struct Node
    {
        struct Node* next;
        int val;
    };
}

int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符
    printf("%d\n", a);
    return 0;
}

命名空间的使用有三种方式:

(1)加命名空间名称及作用域限定符

int main()
{
  printf("%d\n", N::a);
  return 0;  
}

(2)使用using将命名空间中某个成员引入

using N::b;
int main()
{
  printf("%d\n", N::a);
  printf("%d\n", b);
  return 0;  
}

(3)使用using namespace 命名空间名称引入

using namespce N;
int main()
{
  printf("%d\n", N::a);
  printf("%d\n", b);
  Add(10, 20);
  return 0;  
}

命名空间 (C++) | Microsoft Learnicon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/cpp/cpp/namespaces-cpp?view=msvc-170&devlangs=cpp&f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(namespace_CPP)%3Bk(namespace)%3Bk(DevLang-C%252B%252B)%3Bk(TargetOS-Windows)%26rd%3Dtrue

相关推荐

  1. [C++ 入门基础 - 命名空间]

    2024-02-17 07:58:01       20 阅读
  2. C++基础入门命名空间,函数,引用)

    2024-02-17 07:58:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-17 07:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-17 07:58:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-17 07:58:01       82 阅读
  4. Python语言-面向对象

    2024-02-17 07:58:01       91 阅读

热门阅读

  1. Why Not Http?

    2024-02-17 07:58:01       45 阅读
  2. 注册 Hugging Face 后的官网创建模型的教程

    2024-02-17 07:58:01       53 阅读
  3. 使用Cargo国内镜像提升Rust开发效率

    2024-02-17 07:58:01       62 阅读
  4. STM32

    STM32

    2024-02-17 07:58:01      46 阅读
  5. CSS transition(过渡效果)详解

    2024-02-17 07:58:01       46 阅读
  6. B3651 [语言月赛202208] 数组调整

    2024-02-17 07:58:01       54 阅读
  7. Python-2

    2024-02-17 07:58:01       45 阅读
  8. /LatestBuild: Operation not permitted

    2024-02-17 07:58:01       52 阅读
  9. docker 编译安装mysql脚本

    2024-02-17 07:58:01       46 阅读
  10. VOSK——离线语音库

    2024-02-17 07:58:01       44 阅读