C语言向C++过渡

.命名空间的引入

首先看一段代码

代码语言:javascript

AI代码解释

复制代码
#include <stdio.h>

int rand = 10;
int main()
{
	printf("%d\n", rand);
	return 0;
}

编译并不会报错,但如果加上头文件stdlib呢?

在这里插入图片描述

编译器告诉我们,rand重定义了,以前的定义是变量,而在stdlib这个库中,rand是一个函数,将头文件展开变量rand会和库里面的rand函数冲突 我们在编码时,会创建很多的变量、函数,我们并不能保证每个变量和函数都不能同名,或者是不和库中的函数重名,所以我们引入关键字namespace,基本格式如下:

代码语言:javascript

AI代码解释

复制代码
namespace name
{ }

namespace的本质是定义一个命名空间域,避免头文件展开后会和库函数冲突,这个域跟全局域各自独立,不同的域可以定义同名变量

代码语言:javascript

AI代码解释

复制代码
#include <stdio.h>
#include <stdlib.h>
// 引入namespace进行命名隔离
namespace Vect
{
	int rand = 0;
}

int main()
{
	printf("%d", Vect::rand);
	return 0;
}

编译通过:

在这里插入图片描述

下面介绍namespace的一些性质

1.1. namespace的性质
  • 不影响变量/函数的生命周期,仅作名字的隔离作用
  • namespace只能定义在全局,可以嵌套定义,多文件下同名的命名空间会进行合并

代码语言:javascript

AI代码解释

复制代码
#include <stdio.h>
#include "head1.h"

namespace Vect
{
	// 1. 命名空间可以定义变量/函数/类型
	int num = 10;
	int* ptr = &num;

	void Print()
	{
		printf("HELLO,C++!\n");
	}

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

	// 2. 命名空间可以嵌套定义
	namespace coke
	{
		// ...
	}
}

int main()
{
	return 0;
}
1.2. namespace的使用

编译器在编译时,会按照一定的顺序进行查找变量/函数/类型 1. 局部域,通俗理解是自己家 2. 全局域,通俗理解是公共区域;展开的命名空间(别人家声明你可访问),这两个域相同优先级

而查找命名空间也有三种方式:

  1. using将命名空间中某个成员展开,项目中推荐这种方式
  2. 使用域作用限定符 :: 指定查找
  3. using展开全部的命名空间,项目中非常不推荐,日常练习无所谓

代码语言:javascript

AI代码解释

复制代码
#include <stdio.h>
// 使用方法

// 1.域作用限定符指定访问
int num = 10;
namespace Vect
{
	int num = 0;
	char ch = '?';
}

int main()
{
	printf("%d\n", Vect::num);
	printf("%c\n", Vect::ch);
	// 若域作用限定符左边无命名空间,默认查找全局域
	printf("%d\n", ::num);
	printf("%d\n", num);
}

在这里插入图片描述

代码语言:javascript

AI代码解释

复制代码
// 2. using展开局部对象
namespace Vect
{
	int num = 0;
	char ch = '?';
}
using Vect::num;
int main()
{
	printf("%d\n", num);
	printf("%c\n", Vect::ch);
	// 若域作用限定符左边无命名空间,默认查找全局域
}

!\[Pasted image 20250626191832.png]

代码语言:javascript

AI代码解释

复制代码
// 3. using展开全体对象
namespace Vect
{
	int num = 0;
	char ch = '?';
}
using namespace Vect;
int main()
{
	printf("%d\n", num);
	printf("%c\n", ch);
	// 若域作用限定符左边无命名空间,默认查找全局域
}

在这里插入图片描述

思考:局部域、全局域、命名空间域有什么联系和区别 局部域、全局域和命名空间域是 C++ 中三种作用域:

  • 局部域:在函数或代码块内部,只在当前块内有效。
  • 全局域 :定义在所有函数外部,整个程序都能访问,可能需要注意extern
  • 命名空间域 :用来组织代码,防止命名冲突,通过 namespace::变量 展开局部变量 或者全部展开 三种方式访问。

三者的区别在于作用范围和访问方式,它们之间可以嵌套使用,但同名时,遵循局部优先原则,命名空间通过域作用限定符来区分。实际开发中,我们倾向使用局部变量和命名空间来增强代码的可读性和安全性,尽量少使用全局变量。

相关推荐
一次旅行33 分钟前
AutoAWQ完整实战:MIT激活感知AWQ量化,模型显存减半、推理提速且精度无损
人工智能·python·算法
GrowthDiary0071 小时前
算法题:寻找二维数组top k问题
数据结构·python·算法
可编程芯片开发1 小时前
基于全阶观测器的三自由度运动系统状态反馈控制simulink建模与仿真
算法
kobesdu1 小时前
从零推导FAST-LIO的观测雅可比矩阵
人工智能·算法·矩阵
乐思智能科技有限公司1 小时前
PLECS软件学习使用(二)直流电机基本系统模型
人工智能·算法·机器学习·面试·职场和发展
阿米亚波2 小时前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
随意起个昵称2 小时前
贪心模型-Johnson法则
c++·算法
蜡笔小马2 小时前
【保姆级教程】Windows 下 CGAL 6.2 + VS2022 全流程实战:从源码编译到项目集成(附避坑指南)
c++·cgal
xiaoye-duck2 小时前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
旋生万物2 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai