2.4 对齐
? 【规则2-4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它
们的语句左对齐。
? 【规则2-4-2】{ }之内的代码块在‘{’右边数格处左对齐。
示例2-4(a)为风格良好的对齐,示例2-4(b)为风格不良的对齐。 void Function(int x) { ? // program code } if (condition) { ? // program code } else { ? // program code } for (initialization; condition; update) { ? // program code } While (condition) { ? // program code } 如果出现嵌套的{},则使用缩进对齐,如: { ? } 示例2-4(a) 风格良好的对齐 示例2-4(b) 风格不良的对齐 { ? } } while (condition){ ? // program code } for (initialization; condition; update){ ? // program code } } else { ? // program code if (condition){ ? // program code void Function(int x){ ? // program code } ? 对齐可以采用选择待对齐行后Alt+F8的方式。
2.5 长行拆分
? 【规则2-5-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
? 【规则2-5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以
便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 if ((very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <= very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16)) { dosomething(); } virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix); for (very_longer_initialization; very_longer_condition; very_longer_update) { dosomething(); } 示例2-5 长行的拆分 2.6 注释
C语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释通常用于: (1)版本、版权声明; (2)函数接口说明;
(3)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例2-6。
? 【规则2-6-1】注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注
释太多了会让人眼花缭乱。注释的花样要少。
? 【规则2-6-2】如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。
例如
i++; // i 加 1,多余的注释
? 【规则2-6-3】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的
一致性。不再有用的注释要删除。
? 【规则2-6-4】注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有
害。
? 【规则2-6-5】尽量避免在注释中使用缩写,特别是不常用缩写。
? 【规则2-6-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可
放在下方。
? 【规则2-6-7】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,
便于阅读。
2.7 匈牙利命名规范
匈牙利命名法的出发点是把变量名按:属性+类型+对象描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解。
属性部分 全局 变量 类成员变量 静态 变量 g_ 指针 函数 实型 m_ 字 无符号 s_ 双精度 浮点 p fn r w u d 类型部分 长整型 短整型 布尔 双字 字符串 浮点型 (或文件) l n b dw sz f 无效 句柄 计数 字符 整型 字节 v h 描述部分 最大 最小 临时 变量 目的 对象 Max Min Init T(Temp) Src Dst c(cnt) 初始化 ch(c) i(n) 源对象 by 如命名一个全局目的文件指针:FILE* g_pDstFile;
第二篇 常见问题应对
一、无法设置断点
问题描述:按F9无法设置断点
问题原因:1.工程设置没有加入调试信息
2.DLL没被成功调用
3.打开的cpp文件与被调用的DLL版本不匹配(路径不对,两份代码) 解决办法:
1. 确认工程是否加入调试信息: ? 在WorkSpace中右键点击工程
? Settings->C/C++选项卡复选Generate browe info
? Settings->Link选项卡复选Generate debug info和Link incrementally ? 确认,右键clean工程,然后再Build
2. 确认SignallProcessor.exe工程是否正确配置运行参数,检查Settings->Debug选项卡,Program argument是否填写“-c”(读取配置文件的意思,可查看SignallProcessor的头文件了解)
在exe入口函数,如SignallProcessor工程的main函数中的while循环处设置断点,然后右键调出OutPut窗口,观察是否成功调用本DLL。如果没有,查看Decoder.conf或Ana.conf文件是否配置正确.
3. 右键点击工程Clean掉DLL,再调试,在exe入口函数设置断点查看OutPut窗口,如果调用了DLL,说明DLL生成路径与SignallProcessor.exe不同,欲设置断点的cpp对应的DLL与SignallProcessor.exe调用的DLL不匹配。所以需要设置该工程的DLL输出路径到SignallProcessor.exe的路径,或者生成后拷贝DLL到SignallProcessor.exe的路径。
二、断点设置错位
问题描述:在A行设置断点,断点总是出现在A+n行
问题原因:cpp文件与被调用的DLL版本不匹配(路径对,但做了修改) 解决办法:
cpp对应工程生成的是LIB(BaseDecoder):
? 右键点击工程Clean,需要Clean掉解码器DLL和基础解码LIB;
? 编译解码器DLL,如果路径正确,则应该会报错找不到基础解码LIB,如果没报
错,则要找出链接到哪个LIB,并且排除错误。(报错才对,没报错反而不对,这是验证路径的技巧)
? 编译基础解码工程(一定先确认没编译基础解码则解码器编译通不过) ? 编译解码器工程
cpp对应工程生成的是DLL(Decoder):
? 右键点击工程Clean掉解码器DLL; ? 编译解码器工程
三、调试不到断点
问题描述:成功设置断点后F5执行程序,始终不能在断点处终止 问题原因:1.在本段代码运行完后才设置断点,错过时机 2.在本段代码之前进入死循环
3.代码前就有return语句
解决办法:
1. 如Register函数只运行一次,而且不方便设置断点,需要借助CYDD_ASSERT(false)报出断言,然后再进行调试
2. 检查新写代码逻辑,是否会陷入死循环
3. 如果代码前被错误的用了return,则删除;如果是有效性判断中被return,则查看错误原因,也许是被送去的参数就不合法。
四、出现断言错误
问题描述:程序运行一段时间后,出现了断言错误。
问题原因:1.统计程序中所使用的字段,在解码器中没有注册成功,注意检查。
2.程序中所需要的dll在Decord.conf中的调用的dll未写。 3.protocolenum.ini的文件读配置文件
四.非法打开文件的
问题描述:程序运行一段时间后,弹出错误打开文件的对话框。 问题原因:1.fopen程序出现了两次。
四、无法出表
问题描述:成功设置断点后F5执行程序,不能进入解码器
问题原因:1、decorder.Conf的设置没有相应dll。Protocolenum.ini是读配置文件的