dazuiniu's blog

cat /dev/dazuiniu/random

Archive for the ‘C++’ tag

使用 g++ 编译 C++0x 的程序

View Comments

C++ 0x 虽然还没有完全普及开来,但是对于尝鲜的同学会遇到一个问题,怎么编译具有这些新特性的程序呢?利用 G++ 的同学们可以在后面加上这个选项就可以了。

-std=c++0x

Written by dazuiniu

July 29th, 2010 at 11:36 pm

Posted in all about dev

Tagged with ,

C++中匿名的namespace

View Comments

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;
  }
}

时不时的使用这个一下,说不定人家会对你刮目相看呢。

Written by dazuiniu

July 27th, 2010 at 2:20 pm

Posted in programming languages

Tagged with ,

关于 smart pointer 的讨论

View Comments

Modern C++ Design 这本书一向以其艰涩难懂而著称,不过其中的第七章讲述的关于 smart pointer 智能指针 的东西则是事无具细,把所有基本上需要考虑的东西都一一道来,看的很是过瘾,大嘴牛在这里简单的做一些摘记。

  • 智能指针不同以普通的指针,起初的指针只是代表了一个地址,但是在智能指针的概念中,这还代表了“这个指针拥有这个资源”。智能指针的最主要目的就是对于资源管理权的管理。
  • 智能指针一方面要在使用上尽可能的接近普通指针,但是在另外一方面又不能太像,如果太像了的话,那就和使用普通指针无异了。
  • 智能指针之所以可以在使用上十分接近普通指针,就是因为 C++ 提供了可以重载 operator->() 的功能,而 C++ 在遇到-> 的时候如果对象不是内嵌类型,那么在调用该运算符的 -> 函数之后,继续将所得的结果使用 -> 操作,重复这个过程直到对象是内嵌类型。(黑体标出的就是不同于一般成员函数的地方,会多一个操作的过程。)
  • 关于存储介质的讨论,这里有三种类型,内部指针存储的类型,-> 返回的指针类型,和 * 操作返回的引用类型。
  • 在这章里,作者提倡尽可能少的使用成员函数,因为对于智能指针使用成员函数,会在使用与所指向的对象使用成员函数这两种情况混淆起来,不利于分辨,作者的提议是使用外部函数。
  • 所有权的处理。
    1. 深拷贝
    2. 写时拷贝,这个对于智能指针无法有效探测到对于指向对象的使用,故无法实现。
    3. 引用计数,这里对于 指向的对象本身计数 存放的不同地方有三种主要的实现方法。
    4. 引用连接,这个利用双向链表,将对于指向对象的所有智能指针连接在一起。
    5. 破坏性的复制,这个对于 auto_ptr 需要特别注意,在这种语义下不同使用 STL 的容器和算法。
    6. 取地址操作。
    7. 转化到普通指针的操作。通过 operator T*() 可以进行,但是这种隐式的转换经常在不经意间被使用,所以需要特别的注意,比如说 delete 的时候。
    8. 相同比较和不同比较,这个比较复杂,有很多中情况,可以参考原书的介绍。
    9. 大小比较操作。
    10. 检错和错误报告
    11. const与智能指针的结合
    12. 数组的考虑
    13. 智能指针与多线程的结合。这个其实有很多有趣的玩法,可以以后再详述。

大嘴牛在这里的只是一个简述,为自己留个记录,以备查找,想要详细了解的,可以参考 Modern C++ Design 的第七章。

Written by dazuiniu

July 21st, 2010 at 8:00 pm

Posted in reading notes

Tagged with ,

C++的两个连接

View Comments

C++ 这个语言实在是让人又爱又恨,今天大嘴牛看到了两个有趣的连接,分享给大家,名字也很有趣,一个叫 FAQ (frequent asked questions),另外一个叫 FQA (frequent questioned answers).

Written by dazuiniu

July 6th, 2010 at 9:57 am

Posted in for archive,programming languages

Tagged with ,

C++化(Cppify ?)

View Comments

大嘴牛的英文从中学开始就很差,不知道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 中了,特此更正。

[3]. http://article.gmane.org/gmane.comp.gcc.devel/114539

Written by dazuiniu

May 20th, 2010 at 8:16 pm

Posted in all about dev

Tagged with , , ,