游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3426|回复: 6

无名的命名空间有啥用?

[复制链接]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-1-28 22:57:00 | 显示全部楼层 |阅读模式
RT

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-1-29 01:14:00 | 显示全部楼层

Re:无名的命名空间有啥用?

相当于 private namespace, 或 static namespace, 起局部变量作用。 见<The C++ programming language> 8.2.5.1

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-1-29 08:54:00 | 显示全部楼层

Re:无名的命名空间有啥用?

能举个使用的例子吗

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-1-29 12:59:00 | 显示全部楼层

Re:无名的命名空间有啥用?

class factory
在cpp中即可使用non-name namespace来注册

<<c++对话>>
Abstract Factory, Template Style

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-1-29 15:26:00 | 显示全部楼层

Re:无名的命名空间有啥用?

无名命名空间中的东西是当前编译单元(其实就是当前文件)私有的--很象被申明为文件范围内static的函数一样。有了命名空间后,文件范围内的static已经不赞成使用了,你应该尽快让自己习惯使用无名的命名空间(只要编译器支持)。

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-1-30 01:33:00 | 显示全部楼层

Re:无名的命名空间有啥用?

我再来个例子。

在库里有class A和class B,Class A有个Static Member functions用来对Class A进行初始化。在Class B中掉用Class A,所以要保证在使用Class B的时候 Class A已经正确初始化了。那么可以在写程序的时候显式的对A进行初始化,但是这种方式太累赘,容易犯错误,另一种方式如下:

// class A header file
class A {
.... // Class A member and interface

// Helper class
class AInitHelper {
    static int _initRefCount;
    AInitHelper() {
    if( _initRefCount++ == 0 )
    ... // Class A init here
    };

    ~AInitHelper() {
    ... // Deinit here
    };
};
};



namespace {
  A::AInitHelper __init;
};

在class B 的cpp 文件中

#include "a header"
这个时候由于是unnamed namespace,所以会单独建立一个AInitHelper __init的拷贝。

然后 int AInitHelper::_initRefCount = 0;

这个时候由于__init是全局,那么必然先于class B进行初始化。由于在unnamed namespace里,所以即使其他file include A的header,也会有不同的__init,所以可以保证每个include A的module,都会进行_init的初始化,从而检查class A是不是已经初始化了。保证正确的初始化顺序。

这是STL中解决模块之间初试化依赖关系的标准方案.

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2007-1-30 12:26:00 | 显示全部楼层

Re:无名的命名空间有啥用?

在本人看来,只是 装B 用的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 10:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表