VC6常见问题

更新时间:2024-06-07 00:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

版 本 历 史

版本/状态 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功能,找出原因并改正

本文来源:https://www.bwwdw.com/article/u926.html

Top