问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么解决c++域名空间冲突

发布网友 发布时间:2023-05-05 11:26

我来回答

1个回答

热心网友 时间:2023-11-10 11:27

你没有理解C++的namespace。如果你熟悉java的话,你可以这样理解,java中用包机制取代了所谓的命名空间。在java中一般是一个类一个文件的(原则上说多个类放一个文件下也没问题),然后相同功能的一组类文件组合成了一个包。
在C++中,namespace就相当于java中的包,单纯的头文件是不需要命名空间的,如果你想把多个类、辅助函数等等组合成一个整体,就用namespace。
命名空间是防止名称碰撞的机制,比如我有一个class A,你也有一个class A,那么我们在同一个程序下的话到底是用你的A还是我的A?在C++中就这样用I::A、Y::A,而java中则是I.A,Y.A
不需要.h的头文件,是C++的标准头文件,里面都包含了namespace std,如果是标准出现前的C++头文件,如<iostream.h>这些都不包含namespace,那个时候还没这个概念。新的头文件是标准出现后重写的,防止命名碰撞问题(VC++6.0是标准之前的编译器,允许使用旧版的头文件,但这些都不包含namespace,而新编译器都不再使用带.h的C++标准头文件)如果是C的头文件,如<stdio.h>就不包含namespace,C++重写的C的头文件都包含std,名称为<cXXX>,如<cstdio>
至于谁包涵谁的问题就很难说清楚了,因为namespace虽然一般都是用在头文件中的(规范使用是在头文件中),但是一个头文件不一定需要namespace,而且一个namespace可以包涵多个不同头文件。我举个例子:

1
2
3
4
5
6
7
8
9

//file1.h
namespace A{
class B{};
}
//file2.h
namespace A{
class C{};
}
//class B、C 都属于一个namespace A中,但却分属于不同的头文件

你最后提到mport相当于include,你可以这样认为,但又有不同。首先从2者的实现机制来看,import是引入一个包或者引入包下的某个类文件,include只引入头文件(java中没有头文件,所以是实现和声明一起引入的,C++中实现和头文件是拆开的,include只包含声明部分,实现是由链接器最后链接组成的)
其次 java中的 import 既包含了包的引入,又开放了包的命名。比如import java.swing.*; 你用JFrame类时就不用写javax.swing.Frame了,只要写JFrame;但C++中include只包含了声明的引入,要想开放命名空间需要using指令,如using namespace std 或using std::cout,然后就能直接写 cout了,否则每次都要写std::cout
至于你说的std::相当于System.out.,是完全不对的。因为System是属于java.lang这个包下的一个类,而out是类下的一个成员对象。java.lang.才相当于std::
而cout和print()是有本质区别的,这个你可以看下《C++ primer》或者《C++程序设计语言(十周年纪念版)》(这2本书都对namespace有清楚的解释,建议看一下),我简单解释下吧,以下是简化版本的cout实现:

1
2
3
4
5
6
7
8
9
10

namespace std{
……
class ostream{
……
ostream& operator<<(ostream&,const string&);
……
}
……
ostream cout;
}

热心网友 时间:2023-11-10 11:27

你没有理解C++的namespace。如果你熟悉java的话,你可以这样理解,java中用包机制取代了所谓的命名空间。在java中一般是一个类一个文件的(原则上说多个类放一个文件下也没问题),然后相同功能的一组类文件组合成了一个包。
在C++中,namespace就相当于java中的包,单纯的头文件是不需要命名空间的,如果你想把多个类、辅助函数等等组合成一个整体,就用namespace。
命名空间是防止名称碰撞的机制,比如我有一个class A,你也有一个class A,那么我们在同一个程序下的话到底是用你的A还是我的A?在C++中就这样用I::A、Y::A,而java中则是I.A,Y.A
不需要.h的头文件,是C++的标准头文件,里面都包含了namespace std,如果是标准出现前的C++头文件,如<iostream.h>这些都不包含namespace,那个时候还没这个概念。新的头文件是标准出现后重写的,防止命名碰撞问题(VC++6.0是标准之前的编译器,允许使用旧版的头文件,但这些都不包含namespace,而新编译器都不再使用带.h的C++标准头文件)如果是C的头文件,如<stdio.h>就不包含namespace,C++重写的C的头文件都包含std,名称为<cXXX>,如<cstdio>
至于谁包涵谁的问题就很难说清楚了,因为namespace虽然一般都是用在头文件中的(规范使用是在头文件中),但是一个头文件不一定需要namespace,而且一个namespace可以包涵多个不同头文件。我举个例子:

1
2
3
4
5
6
7
8
9

//file1.h
namespace A{
class B{};
}
//file2.h
namespace A{
class C{};
}
//class B、C 都属于一个namespace A中,但却分属于不同的头文件

你最后提到mport相当于include,你可以这样认为,但又有不同。首先从2者的实现机制来看,import是引入一个包或者引入包下的某个类文件,include只引入头文件(java中没有头文件,所以是实现和声明一起引入的,C++中实现和头文件是拆开的,include只包含声明部分,实现是由链接器最后链接组成的)
其次 java中的 import 既包含了包的引入,又开放了包的命名。比如import java.swing.*; 你用JFrame类时就不用写javax.swing.Frame了,只要写JFrame;但C++中include只包含了声明的引入,要想开放命名空间需要using指令,如using namespace std 或using std::cout,然后就能直接写 cout了,否则每次都要写std::cout
至于你说的std::相当于System.out.,是完全不对的。因为System是属于java.lang这个包下的一个类,而out是类下的一个成员对象。java.lang.才相当于std::
而cout和print()是有本质区别的,这个你可以看下《C++ primer》或者《C++程序设计语言(十周年纪念版)》(这2本书都对namespace有清楚的解释,建议看一下),我简单解释下吧,以下是简化版本的cout实现:

1
2
3
4
5
6
7
8
9
10

namespace std{
……
class ostream{
……
ostream& operator<<(ostream&,const string&);
……
}
……
ostream cout;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
强奸罪判多少年可以缓刑吗 20句充满着正能量的最励志的英语名言 如何通过cet-4? 去赤道几内亚,需要带什么行李,生活用品,在那边大概生活一年,什么东西... 去赤道几内亚需要准备什么?主要要预防什么疾病?要准备什么预防药品... 可惜!大部分消费者在交易后会取消亚马逊Prime会员资格 想问下 cpu i7 4900mq. gtx765m显卡. 32G内存 能大部分游戏效果开高么... i7 4800MQ i7 4900MQ 能有多大差别? 外星人14,显卡GTX765M。玩... 三星k2200打印机怎么升级 三星k2200打印机怎么升级br? 三星k2200打印机如何双面打? 为什么我同时登陆2个人的QQ空间起冲突 为什么我的电脑上QQ空间会冲突? 麻将中打高不打低是什么意思 打电话叫我补签传唤证是什么意思 派出所打电话让去了解情况,这算是传唤吗 接到传唤通知电话怎么回事 武汉交社保的基数是怎样的? 武汉市养老保险社平工资是多少 为什么有人爱说脏话 如果一个男生老是对你说脏话代表什么? 接待和信的意义 滴新年第一卡是什么卡 为何C语言数组下标错误(j=12)没有编译错误?最后输出的数组元素a[11]为何是12,不是有个最小值11吗? 矩阵的要求 错误:变量下标格式错误是什么问题 hpv68用药后转成HPV52是什么意思 三个球水貂球帽子男人可以戴吗 男子结婚头戴三顶帽子是什么说法 梦见给男友戴红白三个帽子的预兆 男生边缘控制是什么意思呀? 什么是法律冲突及其产生原因什么是法律冲 问:百度搜索为什么和QQ空间冲突 追随领导还是跟随领导 关于追随力 为什么我们要选择跟随一个领导? 曲率性近视是什么意思 曲率42算不算平 角膜曲率平,虽然近视度数一样,但是因为角膜曲率平,所以眼轴更长,那是不是眼底更容易出问题。? 对影都成不了三人没有月亮是什么意思? 收到社保局稳岗补贴会计分录? 电影本质是什么? 电影的本质是什么 英格兰足球怎么样 健康西安身份证拍摄不能上传 没有社保可以报考一级建造师吗 没有社保可以考一建吗 可以自己交吗 一建考试的时候要带社保卡吗 考一建需要社保证明吗 没有怎么办 广东318什么意思 男生说去318是什么意思?