免费建站赚钱,wordpress整站打包,wordpress重建伪静态,网站内容有什么特点引言#xff1a; 问题#xff1a;学习过C#xff0c;然后再学c的人可能会这么问#xff0c;我#includeiostream之后#xff0c;不就是把头文件拉进来了吗#xff0c;而cin cout等函数不就是iostream.h里面的函数吗#xff0c;我使用cin cout时#xff0c;编译器…引言 问题学习过C然后再学c的人可能会这么问我#includeiostream之后不就是把头文件拉进来了吗而cin cout等函数不就是iostream.h里面的函数吗我使用cin cout时编译器为什么会说 “Error 未定义标示符”呢 解决方法这样写
#includeiostreamusing namespace std;void main(){} 但可能不知道为什么加这句
我刚学C时也不明白为什么看课本解释说什么命名空间的看不明白只是知道这样写才能通过编译也没有深究每次都默默加上去的说。
现在任然是个菜鸟的说看了一些资料之后写了这篇笔记“关于using namespace std;以及为什么有的头文件需要加上.h而有的头文件不需要”可能不够严谨欢迎指出错误。 这是个历史问题。 一、从库的概念说起 这得从库的概念说起你#include进去的就是别人帮你写好的库你可以直接调用头文件里面封装好的函数或类比如你用的cin cout等就是c标准库里面的函数这样你就不用自己写一个函数cin 来实现输入功能也不用写函数cout来实现输出功能直接调用就可以了。除了C标准库一些公司封装了一些函数实现某些强大的功能然后拿来卖比如微软的MFC Trolltech公司的Qt等所以c变得更加强大不仅可以直接调用标准库还能调用别的公司封装好的库。 二、命名空间诞生的原因
早期的c库内容有限可随着时间的推移库的功能越来越强大每个厂商之间可能将库里面的函数或类取了相同的名字比如说A公司的库就可能定义了一个叫做sum的函数而B公司也定义一个叫做sum的函数于是就出现问题了程序员开发时如果同时使用了A的库又使用了B公司的库那么就可能出现混乱你调用的sum到底是哪家公司的。最初人们就想了个办法厂商将名字取得更长更复杂来避免重复可这样做却给编写和阅读带来了困难。后来人们创造了命名空间这个概念1998年它能有效地指出某个标示符到底属于哪个库。 三、什么是命名空间
通过使用 namespace xxx来说明你所用的这个函数或类来自于哪个库或者是自己写的函数。例如C标准程序库就把标准库库里面的函数或类的名称放在一个“叫做std的命名空间”比如cin cout这两个函数的名字就放放在命名空间std里面你可以通过std::cin std::cout来说明你这里使用的cin cout是来自标准库里面的函数而不是自己写了个名字叫做cin的函数也不是别的厂商的库里面的函数cin但这样也比较麻烦每次调用的话就得把cin写成std::cin如果你想要经常可以在程序的开头使用 using std::cin;来说明以下代码所使用的cin是来自std这个命名空间也就是标准库里面的函数。若程序需要大量地使用标准库里面的函数就可以把using namespace std;放在程序的开头来说明以下代码将使用标准库的函数或类程序员不能取和标准库里面冲突的函数或类的名称于是你就能直接使用cin cout而不必用std::cin来说明你这里的cin是std里面的。总之通过命名空间就能有效的说明某个函数或类到底是调用了属于哪里的库。 四、命名空间的出现导致新版头文件的诞生
可是这样做带来了一个新的问题c发展了那么多年直到1998年推出命名空间大约发展了16年现存的代码已经有一定的量了你突然给我搞了一个命名空间以前可没这东西我以前写的代码就不能再新的编译器下运行了这可不行。
于是人们想出了一个办法。为包装了std的那部分标准库构件创建出新头文件名。并且把新的头文件名字取和旧头文件相同但不加后缀.h。所以iostream.h变成了新版头文件iostreamcomplex.h变成了complex而新旧头文件的功能基本上相同的但不完全相同所以使用iostream时想要调用里面的函数就得使用类似std::cin的方法来说明cin是使用标准库里面的函数而不是自己定义或别的厂商的库的函数,当然如前文所述也可以在开头使用using namespace std;来说明以下程序将使用标准库的函数。
当使用iostream.h时使用的是全局命名空间也就是早期的c实现c标准已经明确表示不支持这种用法了所以理论上来说这种用法是非法的但编译器厂商有可能还支持这种用法
当使用iostream时该头文件没有定义全局命名空间必须使用命名空间 std来说明你所使用的函数或类是来自iostream的
而c对待C头文件c可以使用c的头文件的方式是继续支持旧的头文件的支持也既string.h这种用法以保持对C的兼容性。但为了与时俱进因为命名空间是个好东西呀任然对应旧版头文件开发了新版的头文件命名方式是在每个旧版名字前添加一个c。所以C的头文件string.h变成了新版c的cstringC的头文件stdio.h变成了新版c的cstdio。这也是为什么c代码里面有的头文件加.h有的不加.h的原因。#include进来可能是1、新版C头文件如#includeiostream2、新版C语言头文件如#includecstring3旧版的C头文件如#includestring.h 4、旧版C头文件理论上来C是不支持这个用法了但一些编译器厂商任然可以这样使用 五、完结
回到开头的那个问题#includeiostream之后是不能直接调用里面的函数的因为iostream这个头文件属于c标准库的一部分既cin这个函数属于标准库的一个函数如上文所述它的用法是在函数名字放在了命名空间std中你得用std::cin来说明一下这里的cin是来自命名空间std里面的也就是标准库里面的cin函数而不是别的库的cin函数。这是C的用法不要与C混淆。
总结概括库的爆炸性的发展导致经常出现命名重复从而提出了命名空间的概念有效地说明同个名称的函数到底来自哪个库但这导致过去几年所开发出来的代码可能不能使用从而C委员会对应旧版头文件重新开发了新版的头文件命名方式相同但不添加后缀.h。委员会对待C语言头文件的方式类似重新开发了一套头文件命名方式是在头文件开头加上字母c并去掉后缀.h.
新版C对待旧版C和旧版C语言的方式差别在于明确提出不再支持C头文件.h的使用但任然支持C语言头文件.h的使用。这也是为什么现在的C代码有的使用了.h调用了旧版C语言头文件)也可能不加.h使用新版头文件。 ———————————————— 版权声明本文为CSDN博主「买柴火的小火柴」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/u013162593/article/details/22823425