Archive for the ‘C++’ tag
使用 g++ 编译 C++0x 的程序
C++ 0x 虽然还没有完全普及开来,但是对于尝鲜的同学会遇到一个问题,怎么编译具有这些新特性的程序呢?利用 G++ 的同学们可以在后面加上这个选项就可以了。
-std=c++0x
C++中匿名的namespace
C++ 中没有名字的名字空间主要是为了取代单个文件中的 static 字段而出现的,按照 C++ 的标准,文件中使用 static 来做访问限制已经过期了,虽然在当前的每个编译器中,这还是必定支持的,但是我们应该学习一些先进的技术,不是吗?
定义一个没有名字的名字空间很简单,只要不写名字就可以了,就像下面一样:
namespace
{
}
需要注意的是,无名的名字空间中定义的变量范围和此刻名字空间定义的一致,比如 C++ Primer 中提供的一个例子:
int i;
namespace {
int i;
}
i = 10; // will be errors
这个时候去访问 i 就会出现错误。
test-un-namespace.cc:10: error: reference to ‘i’ is ambiguous test-un-namespace.cc:3: error: candidates are: int i test-un-namespace.cc:5: error: int <unnamed>::i
但是正如这个 feature 产生的背景一样,匿名的名字空间不能跨越多个文件,这个和 static 的用法一致,否则还有什么意义呢。
虽然在多个文件中是不连续的,但是在单个文件中确实连续的,正如下面的实例看到的一样,bar 函数可以看到 j 变量。
int i;
namespace {
int j;
}
int k;
namespace {
int l;
int bar()
{
return j;
}
}
时不时的使用这个一下,说不定人家会对你刮目相看呢。
关于 smart pointer 的讨论
Modern C++ Design 这本书一向以其艰涩难懂而著称,不过其中的第七章讲述的关于 smart pointer 智能指针 的东西则是事无具细,把所有基本上需要考虑的东西都一一道来,看的很是过瘾,大嘴牛在这里简单的做一些摘记。
- 智能指针不同以普通的指针,起初的指针只是代表了一个地址,但是在智能指针的概念中,这还代表了“这个指针拥有这个资源”。智能指针的最主要目的就是对于资源管理权的管理。
- 智能指针一方面要在使用上尽可能的接近普通指针,但是在另外一方面又不能太像,如果太像了的话,那就和使用普通指针无异了。
- 智能指针之所以可以在使用上十分接近普通指针,就是因为 C++ 提供了可以重载 operator->() 的功能,而 C++ 在遇到-> 的时候如果对象不是内嵌类型,那么在调用该运算符的 -> 函数之后,继续将所得的结果使用 -> 操作,重复这个过程直到对象是内嵌类型。(黑体标出的就是不同于一般成员函数的地方,会多一个操作的过程。)
- 关于存储介质的讨论,这里有三种类型,内部指针存储的类型,-> 返回的指针类型,和 * 操作返回的引用类型。
- 在这章里,作者提倡尽可能少的使用成员函数,因为对于智能指针使用成员函数,会在使用与所指向的对象使用成员函数这两种情况混淆起来,不利于分辨,作者的提议是使用外部函数。
- 所有权的处理。
- 深拷贝
- 写时拷贝,这个对于智能指针无法有效探测到对于指向对象的使用,故无法实现。
- 引用计数,这里对于 指向的对象本身 和 计数 存放的不同地方有三种主要的实现方法。
- 引用连接,这个利用双向链表,将对于指向对象的所有智能指针连接在一起。
- 破坏性的复制,这个对于 auto_ptr 需要特别注意,在这种语义下不同使用 STL 的容器和算法。
- 取地址操作。
- 转化到普通指针的操作。通过 operator T*() 可以进行,但是这种隐式的转换经常在不经意间被使用,所以需要特别的注意,比如说 delete 的时候。
- 相同比较和不同比较,这个比较复杂,有很多中情况,可以参考原书的介绍。
- 大小比较操作。
- 检错和错误报告
- const与智能指针的结合
- 数组的考虑
- 智能指针与多线程的结合。这个其实有很多有趣的玩法,可以以后再详述。
大嘴牛在这里的只是一个简述,为自己留个记录,以备查找,想要详细了解的,可以参考 Modern C++ Design 的第七章。
C++的两个连接
C++化(Cppify ?)
大嘴牛的英文从中学开始就很差,不知道C++化应该怎么翻译成英文,所谓的C++化,有点沙漠化的那个“化”的意思,就是不断被侵蚀,不断被XX的过程,也算是一种趋势。姑且先翻译成“cppify”吧。
为什么大嘴牛会发出C++化的感慨呢?虽然说最近在TopLanguage总是有调调说C++快不行啦,C#才是王道。但是放眼看看开源世界中所使用的C++情况,还是挺多的。
大嘴牛还不能得出什么像样的结论,在这里也只能是说说现象。判断还是在大家自己。
- 只是看到drizzle项目最近一直在试图将C代码的痕迹除掉,将彻底转化成C++代码。
- GCC其实在早些时候也有编译器的老大Ian Lance Taylor提到说要把GCC中的难看的代码改成用C++来写[1]。但这个项目貌似最后不了了之,Ian老大后来跑去Google参与Go项目去了[2]。牛人啊。
其他的不知道有没有著名的开源项目在从C奔向C++的路上呢?看来要想都转换成C++来写还是不太可能啊。
[1]. cxx-slides
[2]. http://gcc.gnu.org/ml/gcc/2009-11/msg00297.html
UPDATE:
上面大嘴牛关于 Ian 老大的 G++ branch 是不了了之并不正确,Ian 自己说了[3],这个 branch 已经 merge 到 mainline 中了,特此更正。