C++ 使用了using namespace后为何还要#include?

哈利_蜘蛛侠 2016-03-07 04:35:54
很久以前就问过类似的问题,当时貌似问懂了,不过最近又有点糊涂了。我现在理解的是:
#include <iostream>
后,不用using namespace std;
或者using std::cout;
的话,那么在程序中只能够用std::cout。

但是现在的问题是:已经using namespace std;
了之后,为何还需要#include <iostream>才能够使用cout呢?毕竟,在C#中,用using namespace后就可以直接用该名字空间中的类了。

难道是因为C++中的名字空间太多、所以C++不鼓励我们using namespace 而导致的一个副作用?
...全文
744 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在编译C/C++时,将源文件编译成可执行文件主要需要两个步骤:编译和链接 拿一个文件中的方法举例 当编译到某个文件的某个函数时 编译器要查看这个函数之前的代码中是否有这个函数的声明或者定义 #include <iostream> 这句话告诉编译器 我调用的这个函数是有声明的 只是它的定义在别的文件中 namespace的本质是 对全局变量和函数在一定范围内链接属性的更改和控制 using namespace std 链接时 告诉链接器 我是在std中定义的 你可以在那里找到我并链接
赵4老师 2016-03-08
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
super_admi 2016-03-08
  • 打赏
  • 举报
回复 1
C#仅仅使用using namespace是不够的,必须要将含有此namespace的文件引用进来(如System是工程在创建后自动引用的); C++仅仅using namespace是不够的,必须要将含有此namespace的文件包含进来。
一尺丈量 2016-03-08
  • 打赏
  • 举报
回复
引用 7 楼 u011873969 的回复:
[quote=引用 6 楼 u010155023 的回复:] #inlcude 是将一个文件里的声明与定义包含到当前文件来,这样你就可以使用那个文件里的声明与定义了。而using namespace std是一个语法糖,他的实质是告诉编译器当前文件里使用到的某些声明或者定义是在std命名空间下面的,以后使用到这些命名空间的类或者对象时就不必要再加上std这个命名空间了。不然后,当一个对象或者类在一个命名空间时,必须使用[命名空间::类]的使用方式。对于C#,这个语言使用的是完全限定名,Using XXX和C++的using namespace XX作用是一样的。只是在C#中,如果要用到其他文件里的内容时,同一个命名空间的类或者枚举是完全不用include进来的,这只是管理方式的不一样。当使用不同命名空间的类或者其类库的类时,这时的Using XXX和C++的using namespace XX作用完全一样。C#的 Using XXX并不具有C++中#include相当的功能。其他类库中的类或者其他命名空间中的类是如何可以在当前类使用的,这是不需要C#用户关心的。如Using system之后,system里的类就可以直接使用,而不需要system.XXX的使用方式了。再强调一次,C#中Using XXX和C++的using namespace XX作用完全一样
多谢阁下的解答。不过我还是没有十分明白。请问是不是说,任何一个C#程序其实已经默认#include了一大堆库文件了呢?[/quote] 可以这样理解,同一个项目的类本身就是相互可见的。同时一个项目一般会对许多的DLL库进行了引用,你可以查看一下你项目中的引用就知道了。要注意的是,C#中并没有头文件的概念。使用其他类库时只需要对这个类库进行引用,然后就可以使用了。Using XXX不是必须的,你完全可以使用完全限定名来使用类库中的类。
paschen 版主 2016-03-07
  • 打赏
  • 举报
回复
因为cout定义在iostream里面
哈利_蜘蛛侠 2016-03-07
  • 打赏
  • 举报
回复
引用 6 楼 u010155023 的回复:
#inlcude 是将一个文件里的声明与定义包含到当前文件来,这样你就可以使用那个文件里的声明与定义了。而using namespace std是一个语法糖,他的实质是告诉编译器当前文件里使用到的某些声明或者定义是在std命名空间下面的,以后使用到这些命名空间的类或者对象时就不必要再加上std这个命名空间了。不然后,当一个对象或者类在一个命名空间时,必须使用[命名空间::类]的使用方式。对于C#,这个语言使用的是完全限定名,Using XXX和C++的using namespace XX作用是一样的。只是在C#中,如果要用到其他文件里的内容时,同一个命名空间的类或者枚举是完全不用include进来的,这只是管理方式的不一样。当使用不同命名空间的类或者其类库的类时,这时的Using XXX和C++的using namespace XX作用完全一样。C#的 Using XXX并不具有C++中#include相当的功能。其他类库中的类或者其他命名空间中的类是如何可以在当前类使用的,这是不需要C#用户关心的。如Using system之后,system里的类就可以直接使用,而不需要system.XXX的使用方式了。再强调一次,C#中Using XXX和C++的using namespace XX作用完全一样
多谢阁下的解答。不过我还是没有十分明白。请问是不是说,任何一个C#程序其实已经默认#include了一大堆库文件了呢?
小灸舞 2016-03-07
  • 打赏
  • 举报
回复
std是一个命名空间,它里面包含了cout,cin等对象,而<iostream>等头文件作用是: 1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明; 2. 使函数的作用域从函数声明的位置开始,而不是函数定义的位置(实践总结) 3 .提供接口:对一个软件包来说可以提供一个给外界的接口
ynsenyu 2016-03-07
  • 打赏
  • 举报
回复
你不包含哪来的命名空间?晕死我也不喜欢用using,免得看代码有时犯晕不知道哪儿来的
fefe82 2016-03-07
  • 打赏
  • 举报
回复
C++ 不是 C# 。这中横向比较没什么意义。 ============================ #include <iostream> // 告诉编译器 std:: 里有什么成员 using namespace std; // 告诉编译器可以直接使用 std:: 名字空间中的成员。(但并不能通知编译器 std:: 里到底都有啥)
一尺丈量 2016-03-07
  • 打赏
  • 举报
回复
#inlcude 是将一个文件里的声明与定义包含到当前文件来,这样你就可以使用那个文件里的声明与定义了。而using namespace std是一个语法糖,他的实质是告诉编译器当前文件里使用到的某些声明或者定义是在std命名空间下面的,以后使用到这些命名空间的类或者对象时就不必要再加上std这个命名空间了。不然后,当一个对象或者类在一个命名空间时,必须使用[命名空间::类]的使用方式。对于C#,这个语言使用的是完全限定名,Using XXX和C++的using namespace XX作用是一样的。只是在C#中,如果要用到其他文件里的内容时,同一个命名空间的类或者枚举是完全不用include进来的,这只是管理方式的不一样。当使用不同命名空间的类或者其类库的类时,这时的Using XXX和C++的using namespace XX作用完全一样。C#的 Using XXX并不具有C++中#include相当的功能。其他类库中的类或者其他命名空间中的类是如何可以在当前类使用的,这是不需要C#用户关心的。如Using system之后,system里的类就可以直接使用,而不需要system.XXX的使用方式了。再强调一次,C#中Using XXX和C++的using namespace XX作用完全一样
relaxisland 2016-03-07
  • 打赏
  • 举报
回复
C++ 和 C# 不能这么直接比较 C++是从C发展过来的 我的理解是java的import 以及参照java设计的C#的using 同时包含了 include 和using namespce的功能

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧