C++问题:关于匿名命名空间

匿名命名空间有什么用?怎样才能使用匿名命名空间里的标识符?... 匿名命名空间有什么用?怎样才能使用匿名命名空间里的标识符? 展开
 我来答
slatop
2011-12-22 · TA获得超过1390个赞
知道小有建树答主
回答量:381
采纳率:100%
帮助的人:429万
展开全部
主要是为了团体使用时的重名问题.我们举例说明,假如你找一个学校找小明这个人.那么这个叫小明的人可能有好几个,如果你可以确定小明在3班,那么就可以排除掉别的班的小明了.命名空间也就是班级.小明也就是你的变量或函数.现在明白了吧?
使用命名空间里的东西,要使用双冒号::
你也可以解放命令空间,using namespace 空间名字;
在文件头加入这句.这样就可以把空间名字处的空间内容解放出来,之后再使用就不用加::
定义命令空间是
namespace Name
{
int x;
}
这样以来,你如果要在别的地方用这个X变量,就要Name::x=5;这样才可以用.
using namespace Name;
这样后,就可以直接 
x=5;

CA少看两个字,匿名命名空间 也就是在申请的时候不写名字,由系统自动分配.匿名名字空间具有一个很有用的特性,那就是,对于不同的编译单元(cpp文件),“同一个”匿名名字空间中的对象,会被当作不同的实体。而这个特性和全局的static修饰是一致的
追问
能对匿名命名空间解释详细一点吗?如果我要用匿名命名空间里的标识符我要怎么用?
追答
先谈谈全局变量.通常定义一个全局变量,如果没有static约束,那么这个变量在被编译的时候,生成的是public的符号.链接的时候,外部的代码如果有了extern声明,那么外部的代码就可以访问这个全局变量.如果加了static声明的全局变量,那么这个全局变量是私有的,只能在当前的编译单位(.c/.cc等)中访问,外部是不可见的.

//test1.cpp

int g_int;

//test2.cpp

extern int g_int;

void f()
{
g_int = 1;
}

如上,test2引用了test1中的变量.当然,这样生成的目标文件,实际上test2.obj对test1.obj是有依赖的.否则链接的时候找不到符号.比如通常的静态链接库,就是这样,编译好了lib之后,头文件里面有函数声明,如果有变量,那么需要声明为extern,供别人使用.

如果把上面的test1.cpp中的int g_int;加上static修饰,那么链接时,提示test2中引入的符号( _g_int )找不到.

上面的情况对于C和C++都是适用的.C++另外有一种匿名的命名空间,来保证生成的符号是局部的,这样对于匿名空间中的变量等,外部都是不可见的.

//test3.cpp

static void bar(){}

namespace //匿名的命名空间
{
float bar2;
int foo;
}

//test4.cpp
extern int foo;
extern void bar();
extern float bar2;
int main()
{
bar(); //外部的bar()被声明为static,这里链接不到符号.不能访问
bar2 = 0.1f; //外部的匿名空间哩,这里也不能访问.
foo = 0xFF;
return 0;
};//如果将test4的目标和test3的目标进行链接,实际上是找不到这些符号的.链接会失败.

匿名的命名空间是C++的特性,相对于C的static声明来说,可以在匿名的空间里面声明很多变量和函数,这样可以省去了对每个变量和函数添加static声明.
实质上匿名空间的功能跟static声明是一样的.
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
wow_jsh
2011-12-22 · 超过32用户采纳过TA的回答
知道答主
回答量:99
采纳率:0%
帮助的人:74.8万
展开全部
c++里因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。当然可以自己定义自己的名字空间。
一句话讲,名字空间是用来区分同名的类或者函数的。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace
std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
229190064zy
2011-12-23
知道答主
回答量:14
采纳率:0%
帮助的人:9.9万
展开全部
namespace A{//A是可以使用的名字
}
要访问的话用两种方法
1.在使用之前使用这句话 using namespace A;
2.可以使用A::加上要访问的里面的东西
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式