c++中头文件和命名空间的问题
书上说c++标准库函数和类是在标准命名空间中声明的,命名空间是既能定义又能声明的吗;写程序时为什么既要用#include包含标准库又要using标准命名空间,既然包含了头...
书上说c++标准库函数和类是在标准命名空间中声明的,命名空间是既能定义又能声明的吗;写程序时为什么既要用#include包含标准库又要using标准命名空间,既然包含了头文件,预编译时不是就会把头文件中的所有东西就会拷贝到当前文件中吗,此时已经包含了命名空间中声明的那些东西,并且已经是头文件中定义过的,不是就不需要命名空间的声明了吗,拷贝到过来之后那些类啊函数啊的作用域已经是当前文件了。不懂,求大神解答
展开
展开全部
这个可以这样理解:
假如有两个软件公司A公司和B公司,他们都是用C++语言开发他们的产品。那么,他们分别编写了a.h和b.h两个自己的头文件,这两个文件中都有一个叫func()的函数。他们各自使用也没什么问题。
假设你公司也是一个软件公司,你现在要开发一个软件,必须同时用到A公司和B公司的头文件,同时会调用他们的func()函数。这个时候问题就来了,你调用的func()函数,编译器不知道应该选用A公司的还是B公司的。为解决这个问题,C++采用了命名空间,这样,你调用A公司的func()函数,就使用A::func(),B公司亦然。
这个东西初学者不容易理解,不过理解了上面这个例子就马上明白了。只是一种资源的管理方式而已。
假如有两个软件公司A公司和B公司,他们都是用C++语言开发他们的产品。那么,他们分别编写了a.h和b.h两个自己的头文件,这两个文件中都有一个叫func()的函数。他们各自使用也没什么问题。
假设你公司也是一个软件公司,你现在要开发一个软件,必须同时用到A公司和B公司的头文件,同时会调用他们的func()函数。这个时候问题就来了,你调用的func()函数,编译器不知道应该选用A公司的还是B公司的。为解决这个问题,C++采用了命名空间,这样,你调用A公司的func()函数,就使用A::func(),B公司亦然。
这个东西初学者不容易理解,不过理解了上面这个例子就马上明白了。只是一种资源的管理方式而已。
展开全部
1. 预编译时不是就会把头文件中的所有东西就会拷贝到当前文件中吗
错误,不会拷贝
2. 写程序时为什么既要用#include包含标准库又要using标准命名空间,
using关键字有点误导,实际上它只是省了你写std::cout之类的,即使你不用using,你一样可以用标准库里的东西,只是要加std::前缀
错误,不会拷贝
2. 写程序时为什么既要用#include包含标准库又要using标准命名空间,
using关键字有点误导,实际上它只是省了你写std::cout之类的,即使你不用using,你一样可以用标准库里的东西,只是要加std::前缀
更多追问追答
追问
1,预编译时头文件不拷贝是怎么进行的 2,你说的我知道,我是在拷贝进来的前提下,已经有cout的定义了,按照c语言前面有定义了后面就可以直接用了,根本不需要声明,为什么还要使用标准命名空间(标准命名空间生命了头文件中库函数的类和函数)而不是你说的using问题
追答
1. 编译器依次打开各个文件,扫描内容
2. 你所谓的不需要声明,到底时哪个声明?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2020-04-22
展开全部
所以说,1 名称空间相当于对头文件/库文件里的函数建了一个分类目录,把不同的函数分到不同类别或者不同级的空间中避免名称的冲突?
2 而名称空间是在头文件中实现的?
3 函数定义在库文件中以编译后的二进制形式存在;而函数声明在头文件中以可读的代码实现,并且是以名称空间的层级进行组织的?
4 在#include头文件后,在名称空间中定义的变量或者声明的函数,仍然在只有使用using声明或者编译指令或者作用域解析运算符::后才可以使用?
2 而名称空间是在头文件中实现的?
3 函数定义在库文件中以编译后的二进制形式存在;而函数声明在头文件中以可读的代码实现,并且是以名称空间的层级进行组织的?
4 在#include头文件后,在名称空间中定义的变量或者声明的函数,仍然在只有使用using声明或者编译指令或者作用域解析运算符::后才可以使用?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你懂了吗?我也对你说的问题有疑问,能说说是怎么回事吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询