首页 > 编程语言 >c++ 命名空间

c++ 命名空间

时间:2024-05-28 21:14:16浏览次数:17  
标签:std 头文件 C++ C语言 空间 c++ 命名

 

 

C++标准库和std命名空间

C++ 是在C语言的基础上开发的,早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。这个时候的 C++ 仍然在使用C语言的库stdio.hstdlib.hstring.h 等头文件依然有效;此外 C++ 也开发了一些新的库,增加了自己的头文件,例如:

  • iostream.h:用于控制台输入输出头文件
  • fstream.h:用于文件操作的头文件
  • complex.h:用于复数计算的头文件

和C语言一样,C++ 头文件仍然以.h为后缀,它们所包含的类、函数、宏等都是全局范围的

后来 C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”

但是这时已经有很多用老式 C++ 开发的程序了(个人:这里指的是使用老式的C++库开发的应用程序,如果C++库重写的话,这里的应用代码里使用到C++库的地方需要重写修改),它们的代码中并没有使用命名空间,直接修改原来的库会带来一个很严重的后果:程序员会因为不愿花费大量时间修改老式代码而极力反抗,拒绝使用新标准的 C++ 代码。

C++ 开发人员想了一个好办法,

  • 保留原来的库和头文件,它们在 C++ 中可以继续使用
  • 然后再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库

这样共存在两份功能相似的库

  • 使用了老式 C++ 的程序可以继续使用原来的库
  • 新开发的程序可以使用新版的 C++ 库

为了避免头文件重名

  • 新版 C++ 库也对头文件的命名做了调整,去掉了后缀.h,所以老式 C++ 的iostream.h变成了iostreamfstream.h变成了fstream
  • 而对于原来C语言的头文件,也采用同样的方法,但在每个名字前还要添加一个c字母,所以C语言的stdio.h变成了cstdiostdlib.h变成了cstdlib

需要注意的是,旧的C++ 头文件是官方所反对使用的,已明确提出不再支持,但旧的C头文件仍然可以使用,以保持对C的兼容性。实际上,编译器开发商不会停止对客户现有软件提供支持,可以预计,旧的 C++ 头文件在未来数年内还是会被支持。(个人:实测,vstudio2022,clion+mingw64中已经不支持了)

  • 标准C头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中
  • 具有C库功能的新C++头文件具有如 cstdio、cstdlib 这样的名字。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中

可以发现,

  • 对于不带.h的头文件,所有的符号都位于命名空间 std 中,使用时需要声明命名空间 std
  • 对于带.h的头文件,没有使用任何命名空间,所有符号都位于全局作用域。这也是 C++ 标准所规定的

不过现实情况和C++标准所期望的有些不同,对于原来C语言的头文件,即使按照 C++ 的方式来使用,即#include <cstdio>这种形式,那么符号可以位于命名空间 std 中,也可以位于全局范围中,请看下面的两段代码。

  • 使用命名空间 std:
    1 2 3 4 5 #include <cstdio> int main(){ std::printf("http://www.baidu.com\n"); return 0; }

  • 不使用命名空间 std
    1 2 3 4 5 #include <cstdio> int main(){ printf("http://www.baidu.com\n"); return 0; }

这两种形式在 Microsoft Visual C++ 和 GCC 下都能够编译通过,也就是说,大部分编译器在实现时并没有严格遵循标准,它们对两种写法都支持,程序员可以使用 std 也可以不使用。第 1) 种写法是标准的,第 2) 种不标准,虽然它们在目前的编译器中都没有错误,但我依然推荐使用第 1) 种写法,因为标准写法会一直被编译器支持,非标准写法可能会在以后的升级版本中不再支持

使用C++的头文件

虽然 C++ 几乎完全兼容C语言,C语言的头文件在 C++ 中依然被支持,但 C++ 新增的库更加强大和灵活,请读者尽量使用这些 C++ 新增的头文件,例如 iostream、fstream、string 等

前面几节我们使用了C语言的格式输出函数 printf,引入了C语言的头文件 stdio.h,将C代码和 C++ 代码混合在了一起,我不推荐这样做,请尽量使用 C++ 的方式。下面的例子演示了如何使用 C++ 库进行输入输出

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> #include <string> int main(){     //声明命名空间std     using namespace std;          //定义字符串变量     string str;     //定义 int 变量     int age;     //从控制台获取用户输入     cin>>str>>age;     //将数据输出到控制台     cout<<str<<"已经成立"<<age<<"年了!"<<endl;     return 0; }

运行结果:

岳麓书院↙
1↙
岳麓书院已经成立1年了!

string 是 C++ 中的字符串类,初学者可以将 string 看做一种内置的数据类型,就像 int、float 等,可以用来定义变量。cin 用于从控制台获取用户输入,cout 用于将数据输出到控制台。

using namespace std;,它声明了命名空间 std,后续如果有未指定命名空间的符号,那么默认使用 std,代码中的 string、cin、cout 都位于命名空间 std。

在 main() 函数中声明命名空间 std,它的作用范围就位于 main() 函数内部,如果在其他函数中又用到了 std,就需要重新声明,请看下面的例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> void func(){     //必须重新声明     using namespace std;     cout<<"http://www.baidu.com"<<endl; } int main(){     //声明命名空间std     using namespace std;          cout<<"岳麓书院"<<endl;     func();     return 0; } 

如果希望在所有函数中都使用命名空间 std,可以将它声明在全局范围中,例如:

1 2 3 4 5 6 7 8 9 10 11 #include <iostream> //声明命名空间std using namespace std; void func(){     cout<<"http://www.baidu.com"<<endl; } int main(){     cout<<"岳麓书院"<<endl;     func();     return 0; }

很多教程中都是这样做的,将 std 直接声明在所有函数外部,这样虽然使用方便,但在中大型项目开发中是不被推荐的,这样做增加了命名冲突的风险,我推荐在函数内部声明 std

 

参考:

https://www.cnblogs.com/zjuhaohaoxuexi/p/16470235.html

标签:std,头文件,C++,C语言,空间,c++,命名
From: https://www.cnblogs.com/rebrobot/p/18218893

相关文章

  • 【C++】<图形库> 三人成棋(面向对象写法)
     目录一、游戏需求二、程序架构三、代码实现四、实现效果五、已知BUG一、游戏需求构建一个五子棋游戏,在自定义棋盘宽度和高度的基础上,实现三人对战功能,并且能判定谁输谁赢。二、程序架构(1)对象分析:【1】需要一个棋盘(ChessBoard)类来绘制棋盘。【2】有三人对......
  • c++ vector 正确释放内存
     今天在看微博的时候,有人提出了一个对于Vector内存泄露的疑问( Link)。博主采用Vector存储一些数据,但是发现在执行clear()之后内存并没有释放,于是怀疑产生了内存泄露。随后有人回复:“vector的clear不影响capacity,你应该swap一个空的vector。”开始并不知道回复......
  • Keras深度学习框架第三十一讲:KerasTuner定制搜索空间
    1、绪论在本文中我们将深入探讨如何在不直接修改HyperModel代码的情况下,定制KerasTuner的搜索空间。在深度学习的超参数优化过程中,搜索空间的定制是一个关键的步骤,因为它决定了Tuner将尝试哪些不同的配置组合。通过定制搜索空间,我们可以更有效地探索那些可能对模型性能产......
  • C++实现获取设备管理器中的设备信息
     C++实现获取设备管理器中的设备信息,基本调用了windowsAPI函数,除此之外,还引用了setupapi.lib库,代码如下所示://PrintDeviceInfo.cpp:定义控制台应用程序的入口点。//#include<stdio.h>#include<locale.h>#include<Windows.h>#include<setupapi.h>#pragmacomm......
  • C++实现删除打印机副本功能
     我们要实现此功能,首先需要获取到打印机的名称,其次是将获取到的打印机名称依次删除。一、获取打印机副本名称1.我们获取打印机副本名称,可以使用windowsAPI中的EnumPrinters函数,该函数可以枚举出我们电脑中的打印机设备信息,该函数使用方法如下:DWORDFlags=PRINTER_ENU......
  • C++实现dll文件的显示调用
    我们实现dll文件的显示调用,主要分为三个步骤:创建DLL、导出函数、使用DLL。其中离不开WindowsAPI函数,使用到了LoadLibrary、GetProcAddress、 FreeLibrary等,以下是一个简单的示例程展示整个过程。:1.创建DLLMyLibrary.h//MyLibrary.h#ifndefMY_LIBRARY_H#defineMY_LI......
  • C++跨平台库boost和Poco的编译
    PrerequisitesCMake3.5ornewerAC++17compiler(VisualC++2022,GCC8.0,Clang5,ornewer)在window下编译依赖的三方库编译POCO$gitclone-bmasterhttps://github.com/pocoproject/poco.git$cdpoco$mkdircmake-build$cdcmake-build$cmake..$cma......
  • C++17 链接 C++11 lib 出现重复定义
    C++11实现staticconstexpr是按照conststatic实现的,需要在.cpp中定义://tmp.hclassStatisTest{public:staticconstexprconstcharliteral[]="xxxliteral";};//tmp.cc#include"tmp.h"constcharStatisTest::literal[];//compile......
  • 单片机中的数据类型占用空间及取值范围
    参考链接 8051单片机基础5:数据类型占用空间大小及取值范围-电子工程世界(eeworld.com.cn)    参考资料:Keil>Help>uVisionHelp>Cx51CompilerUser’sGuide>LanguageExtensions>DataTypesKeil>Help>uVisionHelp>ArmCompiler5User......
  • 阿赵UE引擎C++编程学习笔记——文件夹操作和文件读写
      大家好,我是阿赵。  这次学习一下在UE里面使用C++的API操作文件读写和文件夹操作。一、UE引擎获取相关路径  获取到路径一般是相对路径,使用FPaths::ConvertRelativePathToFull转换后,可以获得完整的绝对路径。FStringcontentDir=FPaths::ProjectContentDir();......