VC6常见问题
更新时间:2024-06-07 00:35:01 阅读量: 综合文库 文档下载
- vc6常见错误推荐度:
- 相关推荐
版 本 历 史
版本/状态 V1.0 作者 胡锡哲 参与者 起止日期 2010.04.13~ 2008.04.14 备注 创建
目录
第一篇 快捷键和代码整洁
一、快捷键
常用快捷键及其功能如下(按一般使用顺序): F9 设置断点 (Ctrl+F9删除所有断点)
F5 未编译:编译并执行;调试中:执行至下一断点 F10 单步执行
F11 跟踪进入函数内部(该函数实现所在工程和代码应该加入打开的dsw文件) TAB 插入一个制表符,用于对齐 Ctrl+F8 自动对齐
Ctrl+TAB 在已打开最近两个文档中切换,按住Ctrl不松开的情况下按TAB则可以在多个文
档中切换
Ctrl+B 设置条件断点 Ctrl+H 文本替换 Ctrl+F 查找文本
Ctrl+S 保存,多保存,以免异常关机丢失数据 Ctrl+Z 撤销上一次更改
二、代码整洁之道
参考林锐博士《高质量C++编程指南》
2.1 空行
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,所以不要舍不得用空行。
? 【规则2-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。参见示例2-1
(a)
? 【规则2-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加
空行分隔。参见示例2-1(b ) // 空行 void Function1(?) { ? } // 空行 // 空行 while (condition) { statement1; // 空行 if (condition)
void Function2(?) { ? } // 空行 void Function3(?) { ? }
{ statement2; } else { statement3; } // 空行 statement4; } 示例2-1(a) 函数之间的空行 示例2-1(b) 函数内部的空行 2.2 代码行
? 【规则2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的
代码容易阅读,并且方便于写注释。
? 【规则2-2-2】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行
语句有多少都要加{}。这样可以防止书写失误。
示例2-2(a)为风格良好的代码行,示例2-2(b)为风格不良的代码行。
int width; int depth; x = a + b; y = c + d; z = e + f; if (width < height) { dosomething(); } for (initialization; condition; update) { dosomething(); } // 空行 other(); 示例2-2(a) 风格良好的代码行 示例2-2(b) 风格不良的代码行
for (initialization; condition; update) dosomething(); other(); if (width < height) dosomething(); // 宽度 // 深度 X = a + b; y = c + d; z = e + f; int height; // 高度 int width, height, depth; // 宽度高度深度
? 【建议2-2-1】尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未
被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如
int width = 10; // 定义并初绐化width int height = 10; // 定义并初绐化height int depth = 10; // 定义并初绐化depth
2.3 代码行内的空格
? 【规则2-3-1】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少
要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
? 【规则2-3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 ? 【规则2-3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 ? 【规则2-3-4】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,
其后要留空格,如for (initialization; condition; update)。
? 【规则2-3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如
“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
? 【规则2-3-6】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加
空格。
? 【规则2-3-7】象“[]”、“.”、“->”这类操作符前后不加空格。
? 【建议2-3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉
一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d)) void Func1(int x, int y, int z); // 良好的风格 void Func1 (int x,int y,int z); // 不良的风格 if (year >= 2000) // 良好的风格 if(year>=2000) // 不良的风格 if ((a>=b) && (c<=d)) // 良好的风格 if(a>=b&&c<=d) // 不良的风格 for (i=0; i<10; i++) // 良好的风格 for(i=0;i<10;i++) // 不良的风格 for (i = 0; I < 10; i ++) // 过多的空格 x = a < b ? a : b; // 良好的风格 x=aFunction(); // 不要写成 b -> Function(); 示例2-3 代码行内的空格
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是读配置文件的
断言 出现fclose。C错误,stream!=full 进行调试,在断言的前面设置断点,一定有写错误。导致关闭空。
初始化 断言错误 看看 protocolenum 是不是没有写
第三篇 版本管理工具SVN
一、提交的文件类型
一般为.def、.cpp、.h、.dsp等非临时性文件,dsp文件不要轻易上传(没有修改工程设置,只添加了cpp或者头文件时可以上传)
二、提交原则
1.自己负责自己的代码,不要提交他人的代码,对他人的代码有修改需要上传时,应当通知该代码负责人,让他本人修改后提交
2.提交前先update更新,达到与服务器版本一致 3.在本机编译通过,调试正确的代码才能上传 4.当发生冲突时(黄色感叹号),或上传失败时,使用SVN的TorToiseSVN->diff功能,找出原因并改正
正在阅读:
VC6常见问题06-07
三防应急预案 - 图文12-04
年产五十万吨建筑用凝灰岩矿产品项目可行性研究报告(目录) -07-05
资源环境模型库管理系统的构建方法研究04-22
2022年度8新九上历史知识点04-19
探究题练习12-28
草原管护员管理办法03-13
28888工程经济学与项目融资模拟题01-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 常见问题
- VC6
- 会计基础第四章练习
- 2017小升初数学总复习
- 教师口语期末复习题1
- 关于印发《江苏省房屋建筑和市政基础设施工程质量监督工作实施细
- 《宏观经济学》习题(学生版)
- 七年级地理下册综合练习题
- 第二届全国学生规范汉字书写大赛试卷及答案
- 趣味标点教案及反思
- 清泉小学致学生家长的一封信1
- 游标卡尺等测量器具的使用
- 湖南省2018届高三六校联考试题理科综合能力物理部分(word,含答案
- 2011秋纳税筹划综合练习简答及案例分析
- 仁爱英语七年级下册Unit6导学案综述
- 资产证券化理论和案例(全面系统学习)
- 北京高院民事案件解答
- 会计BB2
- 新入职大学生管理办法
- 中山市2015届九年级4月质量调研英语听说考试试题(1-4) - 图文
- 第10届运动会秩序册
- 权威事业单位考试(教师)全真模拟试卷(十)