关于C++的新认识

最近是彻底变成代码民工了。看不到头的C++编程和不知何时能完成的Verilog Parser。以下是这一段时间里获得的新认识,按脑袋开窍的前后顺序排序(也就是没顺序):

1. Bison和Flex。数年前就知道,但从来没有静下心来学。现在是硬头皮用上了。Bison是语法检测和语义解释器,yacc的升级版,Flex是代码扫描器(将源代码换成语法检查能够识别的token流,顺便也有语法检查功能),lex的升级版。但是还缺一个预处理,不能处理头文件。不过将Bison和Flex连起来,设计自己的数据结构并读入单个Verilog文件已经很头大了,不知最后能否完成。

2. #line 头一回看见这么个宏。其作用是告诉C/C++编译器以下代码为另一个源文件的代码(暗指当前代码为自动生成代码),报错时则会直接报真正的原文件错误。(利大于弊,有时候我还是会想看自动生成代码的行数。)

3. namespace 是开放的。也就是说可以随意的向任何一个namespace里面添加类和函数。编译器只是简单地把他们连起来。(看起来有点危险)

4. union里面不能出现复杂类类型(有自定义构造函数的类)。(我怎么就觉得这是个bug,一下子union就不好用了,不过C++11好像准备支持)

5. 返回值的不同不能作为方法多态的判别,也就是两个函数如果只有返回值不同是重名的。(要是可以该多好,可能是因为C++的默认类别转换)

6. 子类的构造函数不能直接初始化父类成员,而必须通过父类的初始化函数初始化。(为什么不可以,构造时父类成员不可见?)

7. 突然意识到在父类中定义私有成员基本是无意义的,因为不可能在子类中可见。(为何不能以私有继续继承呢?)

8. 没有虚函数的类对象不能使用动态类型转换(dynamic_cast)(据说是因为需要用到虚函数表,没有虚函数的对象没有该表,原理上基本没道理不支持啊!)

9. 局部作用域内的类型不能作为STL的类型参数。(没天理,用个STL的范类型还必须使用全局作用域,介就是个bug!!! C++11的lamda将会解决这个问题,但我还不准备把C++那蹩脚的函数式编程用上,太纠结了。)

10. shared_ptr好像是个好东西,尽量用上。

11. C++居然把从int到char*的C函数(itoa)从stdlib里面给扒了,没道理啊。最后用了boost::lexical_cast。感觉上杀鸡焉用牛刀。

12. boost::regex的正则表达不错,是个好东西。

13. GNU MP库是个好东西。能做多于32位的数据操作,白写了三天的大数加减乘除。

14. Boost::format 提供了比sprintf更强大的格式化字符串工具。

15. 包含const成员变量的类是不能赋值的(无法重载operator=)。

16. 由于ostream没有拷贝方法,想在自己的类中定义一个可重定向ostream只能想其他办法,比如使用基类ios的rdbuf()方法重置ostream所指向的流。

(不定时更新该列表)

装个Linux还是不那么容易

都这么多年了,本来以为装个Linux操作系统应该是顺手拈来的事情,不过还是被打击了一把。

为了能在家更容易地继续白天的工作,同时我那i7笔记本的散热问题也越来越严重,基本不能干重活了,订了台Dell i5的台式机。这周一终于收到了。打开机箱,安装上,就直奔主题,开装Fedora。不过麻烦也开始了。。

刻好了Fedora 16的Live CD,CD启动,然后就歇了。报错找不到安装映像,进入了dracut控制台。

dracut Warning: No root device "live:/dev/disk/by-label/Fedora-16-x86_64-Live-Desktop.is" found

Dropping to debug shell.
sh: can’t access tty; job control turned off

经过一番探索之后,痛苦地发现,Live CD的启动映像已经装上(显然的,不然怎么出现控制台),然而它却非常无能地未能在正确识别我的光驱!搞了这么久,连个普通的SATA光驱都没搞定,也不知道Fedora的人是怎么搞的,只能放弃。

退而选择Ubuntu,Ubuntu 11.10倒是成功安装,不过安装后的第一次自启,在1分多钟的屏幕狂闪之后死了。倒也不是彻底死掉,摸索后发现F1的命令行还活着。进去更新所有软件包后,问题依旧。

显然,这个是显卡的驱动问题。Google一番之后,安装了fglrx软件包(ATI显卡的驱动)之后,终于看见了用户登陆界面。已经不容易了,但问题没完。

登陆之后,屏幕又定在那不动了,这回,连F1的命令行也没了。再Google发现很多人遇到了和我一样的问题,罪魁祸首在于Ubuntu所使用的轻量版gdm(Gnome显示管理)。换回原来的gdm,这个操作系统是终于安上了。

另外,如果老报找不到pixmap,安装gtk2-engines-pixbuf能解决问题。

synergy在ubuntu 11.1上也有问题,有时候鼠标不能划出屏幕,必须拖一下Linux上的某一个窗口才能划到另一个屏幕上。奇怪的问题。新的Gnome也难用死了,还不如老的呢,连个CPU使用监视器也没有(有,就是不能固定到顶端)。

总结:
1. Live CD找不到安装映像,往往是CD驱动没装上,改用USB安装或grub硬盘安装(前提已经有一个Linux并且知道怎么改grub)。
2. 屏幕没反应,换命令行装显卡驱动。
3 轻量版gdm不好用,有问题换回老版。
4 Linux还是不够友好,安装仍然是个技术活。