中山建设工程招聘信息网站,北京网站设计价格,酒仙网技术开发与网站建设方面,网站换肤代码文章目录 一、C简介1. C的发展历史2. C参考文档 二、namespace命名空间1. C语言的一个缺陷2. namespace3. 命名空间的使用3.1 命名空间成员访问3.2 using展开 一、C简介
1. C的发展历史
C起源于1979年的贝尔实验室#xff0c;Bjarne Stroustrup#xff08;本贾尼博士#… 文章目录 一、C简介1. C的发展历史2. C参考文档 二、namespace命名空间1. C语言的一个缺陷2. namespace3. 命名空间的使用3.1 命名空间成员访问3.2 using展开 一、C简介
1. C的发展历史
C起源于1979年的贝尔实验室Bjarne Stroustrup本贾尼博士在那里从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务他感受到了现有编程语言如C语言在表达能力、可维护性、可扩展性方面的不足。他在1983年在C语言的基础上添加了面对对象编程的特性。设计出了C的雏形此时的C已经有了类、封装、继承等核心概念。 随后的几年中C在学术界和工业界的应用逐渐增多一些大学和研究所开始将C作为教学和科研的首选语言一些公司开始在产品开发中尝试使用C。这一时期C的标准库和模板等特性也得到了进一步的完善和发展。 C的标准化于1989年开始当时成立了一个ANSI和ISO国际标准化组织的联合标准化委员会。1994年标准化委员会提出了C标准化的第一个草案。不久惠普实验室开发了一系列软件统称为STLStandard Template Library联合标准化委员会投票通过了将STL包含在C标准的提议。但STL对C的扩展超出了C最初定义标准范围虽然在标准中加入STL是个重要的决定但也因此延缓了C的标准化进程。 直到1997年11月14日联合标准化委员会通过了该标准的最终草案。1998年C的ANSI/ISO标准被投入使用。
而每隔几年C都会迎来一次版本更新如1998年的C98、2003年的C03、2011年的C11、2014年的C14……目前2026年的C26正在制定中。 一句话总结C是一门扩展了C语言的语言它兼容C语言的大部分语法 2. C参考文档
https://legacy.cplusplus.com/reference https://en.cppreference.com/w/ https://zh.cppreference.com/w/cpp 这三个网站是C程序设计者最常用的C参考文档。
第一个我们已经不陌生了在C语言学习阶段经常去查询库函数 然而它并不是C的官方文档是“民间大神”建设的科普性网站。在UI和用户访问方面相比官方文档改进了不少。缺点是它太久没有更新内容很老甚至可能不是正确的了。
第二个网站就是C的官方文档是全英文的也是最推荐大家学习的。第三个网站是官方文档的翻译版。我们鼓励大家还是阅读官方文档因为作为程序员培养英文文档阅读能力还是很重要的有一些知识与技术可能并没有汉化要依靠自己去查询学习。 二、namespace命名空间
1. C语言的一个缺陷
还记得我们讲过作用域是一个程序设计概念。通常来说针对每一个变量都有它的可用的范围这就是作用域。C语言中我们只接触到了全局域、局部域而在同一个域中不能出现相同名字的变量或函数或类型否则会编译报错。在大型的项目中可能要用到成千上万个函数团队多人协作时经常会有起名冲突的问题这是C语言无法解决的问题。
2. namespace
所以C克服了这一问题提出了命名空间这一概念。定义命名空间需要用关键字namespace后面加自定义空间名字接上一对{ }{ }中即为命名空间的成员可以定义变量、函数、类型。 tip进入C的学习记得创建源文件后缀是 .cpp 哦 namespace test //test是自定义名字
{int a 1;void Swap(int* x, int* y){*x *x ^ *y;*y *x ^ *y;*x *x ^ *y;}struct st{int n;char m;};
}namespace的本质是定义了一个域和其他局部域、全局域相互独立。既然它们是不同的域完全可以在各自其中定义相同名字的变量或函数或结构了。举个例子
#includetest.h
int a 2;
int main()
{return 0;
}
//如果test.h中有int a;则程序会报错
//如果test.h中有namespace test{ int a; }不会报错
//前者程序中的全局域中出现了两次定义a头文件中一次主函数上面一次
//后者的全局域和命名空间域各只出现了一次定义aC中域有全局域、函数局部域、命名空间域、类域。域影响的是编译时语法查找一个变量或函数或类型出处的逻辑所以在一个域内出现的相同名字会使语法无法判断。有了域隔离名字冲突就解决了。除此之外局部域和全局域还会影响变量的生命周期而命名空间域和类域的变量生命周期默认是整个程序的生命周期。
我们还要知道的是
namespace只能定义在全局不能定义在函数里。namespace可以嵌套定义。项目工程中多文件中定义的同名namespace会被认为是一个namespace会被程序自动合并不会冲突。C标准库都放在一个叫stdstandard的命名空间中。
//namespace的嵌套定义
namespace MiHoYo
{int a 10;char c Q;namespace Honkai_3{int a 1;char c X;}namespace Genshen_Impact{int a 4;char c J;}namespace Honkai_Star_Rail{int a 9;char c O;}
}3. 命名空间的使用
3.1 命名空间成员访问
访问命名空间的操作符是::使用方式和结构体的. -很像。 比如语句test::a是从命名空间test中找变量a::a默认是从全局域中找变量a而a就是先从局部域找a找不到再从全局域找a。函数或类型也同理 代码示例
#includestdio.hnamespace test1
{int a 1;namespace test2{int a 2;}
}int a 3;int main()
{int a 4;printf(%d\n, test1::a); //访问test1的aprintf(%d\n, test1::test2::a); //访问test1中的test2中的aprintf(%d\n, ::a); //默认访问全局域的aprintf(%d\n, a); //访问局部域的a局部域没有a则访问全局域的areturn 0;
}函数也是一样的
#includestdio.hnamespace test
{int a 2;int b 8;int Add(int x, int y){return x y;}
}int main()
{printf(%d, test::Add(test::a, test::b));return 0;
}3.2 using展开
C中还有一个关键字using能将命名空间成员展开即让这个成员从命名空间中“出来”到全局域中相当于全局域中再定义了一次原命名空间仍保留成员。使用方法是using 命名空间名::成员名;如
namespace test
{int a 1;char c P;
}
using test::a; //这一句可以看做int a 1;
void main()
{printf(%d , a);printf(%d , test::a);//两者结果相同
}但是展开了a相当于还是在全局域中定义了a又带来了命名冲突的风险。所以只有项目中经常访问不存在冲突的成员推荐这种方式。
特别地using namespace test;可以将命名空间test的全部成员都展开 然而展开命名空间中的全部成员命名冲突风险很大项目中不推荐。只有我们的日常小练习中方便推荐使用。 本篇完感谢阅读~