最近是彻底变成代码民工了。看不到头的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. 突然意识到在父类中定义私有成员基本是无意义的,因为不可能在子类中可见。(为何不能以私有继续继承呢?)
9. 没有虚函数的类对象不能使用动态类型转换(dynamic_cast)(据说是因为需要用到虚函数表,没有虚函数的对象没有该表,原理上基本没道理不支持啊!)
10. 局部作用域内的类型不能作为STL的类型参数。(没天理,用个STL的范类型还必须使用全局作用域,介就是个bug!!! C++11的lamda将会解决这个问题,但我还不准备把C++那蹩脚的函数式编程用上,太纠结了。)
11. shared_ptr好像是个好东西,尽量用上。
12. C++居然把从int到char*的C函数(itoa)从stdlib里面给扒了,没道理啊。最后用了boost::lexical_cast。感觉上杀鸡焉用牛刀。
13. boost::regex的正则表达不错,是个好东西。
14. GNU MP库是个好东西。能做多于32位的数据操作,白写了三天的大数加减乘除。