近期关于C/C++编程的一些体会
最近在开发一个xml文件导出lua脚本并用lua虚拟机对脚本进行编译的模块, 对我而言也算是实现一个比较复杂的功能了
现在模块大致完工, 期间遇到了不少问题, 解决之后有了些许体悟, 记录一下
1. 关于缓存清空
模块开发过程中有需求是要求对多个xml生成一个共有的类似头文件一样的变量定义, 每扫描一个xml就会生成一堆明文脚本, 这些脚本是以字符串的形式存储在缓冲变量中的, 每次所有xml扫描结束后, 再把缓冲变量中的所有脚本一次性编译生成一个lua用的定义头文件. 这样一来, 每次生成完定义头后, 就要记得把这个缓冲clear一下, 不然多次扫描后生成的定义头内容直接爆炸...
2.关于fclose
文件操作使用fopen和fwrite, fwrite是自带一个缓冲区的, fwrite接收到的内容并不会立刻写入文件中, 在编译lua脚本时, 用到了lua_dump这个接口, 这个接口接受一个文件指针, 最后调用fwrite写入新生成的脚本. 在每次dump完成后, 如果忘记fclose, 并在调试时直接停止调试, 会发现所有的文件都正常生成了但是内容全是0kb, 且运行调试全程没有错误...
3.关于静态成员函数与回调函数中的usrData指针
在设计静态成员函数和回调函数时, 最好加一个void类型的指针, 在后期接口复用的时候可以通过这个指针带入很多有用的数据, 比如在静态成员函数调用时传入this, 就可实现在静态成员函数中调用非静态成员函数和非静态成员变量
4.关于成员变量的修改和拷贝赋值
在生成脚本前, 需要为每一个函数加上其所属库的声明, 例如:
1 LibTest = {} 2 3 LibTest.hello_world = function() 4 print('HelloWorld') 5 end
而函数名是作为一个成员变量存储在一个扫描器类中的, 这个函数名很有可能在其它地方被使用到(我不知道的地方), 那么如果我直接在生成脚本前修改这个成员变量, 看起来是很方便很轻松, 但是在之后的程序运行过程中就有可能发生我没预料到的问题(因为扫描器类并不是我编写的), 而且单纯的修改成员变量内容也会出现与(1)----缓存清空相似的问题, 即在多次调用扫描后, 函数脚本会变成这个鸟样子
1 LibTest = {} 2 3 LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.LibTest.hello_world = function() 4 print('HelloWorld') 5 end
这里我认为比较好的解决方法是拷一份扫描器对象, 然后肆意修改这个临时对象, 把这个临时对象变成我们的形状, 再用这个临时对象去生成脚本, 但是这要求类定义了拷贝赋值, 不然浅拷贝可能会造成更多问题, 最后我选择的解决方法是用一个临时变量暂存成员变量的内容, 然后对成员变量进行修改, 待到生成脚本结束后, 在用临时变量把这个成员变量的内容还原回去
以上, 仅对自己最近的思考过程做一个简单的总结, 如有错误疏漏, 欢迎指正