第一部分 代码开发技巧 3
第1章 编写好的代码 3
1.1谁需要本书? 4
1.2教学方法 5
1.3从何处开始阅读? 5
1.4警告!并非所有的C/C++编译器都完全相同 6
1.5语言无关的设计工具101 6
1.5.1准备 7
1.5.2模型! 7
1.5.3结构图、伪代码及IPO框图 8
1.6好的程序设计的五点要素 12
1.7规则意味着可以打破 13
1.7.1安塞尔亚当斯(Ansel Adams)或毕加索(Picasso) 13
1.7.2注释块 13
1.7.3标识符:identifiers、IDENTIFIERS和Identifiers 14
1.7.4间隔与缩进 15
1.8数据类型 20
1.9匈牙利表示法 23
1.9.1 MFC、句柄、控件及结构的命名规范 23
1.9.2一般前缀命名规范 24
1.9.3变量命名规范 24
1.9.5 Microsoft MFC宏命名规范 25
1.9.4应用程序符号命名规范 25
1.9.7静态库版本命名规范 26
1.9.8动态连接库命名规范 26
1.9.9 windows.h命名规范 26
1.9.6库标识符命名规范 26
1.10操作符优先级 27
1.11小结 28
第2章 使用编译器优化 31
2.1编码的责任与编译器的优化 32
2.2 Microsoft Visual C++的优化 33
2.2.2函数级连接 34
2.2.1调度指令 34
2.2.3字符串池 35
2.2.4使用register键字 35
2.2.5常量和复制的传播 36
2.2.6消除死代码和死存储 37
2.2.7删除冗余子表达式 37
2.2.8优化循环 37
2.2.9降低强度 38
2.2.10 inline键字的使用 38
2.2.12关闭堆栈检查 39
2.2.11省略帧指针 39
2.2.13覆盖堆栈 40
2.2.14函数调用之间允许使用别名 41
2.2.15全局优化 41
2.2.16产生内部函数的内联 41
2.2.17优化math.h 42
2.3 Microsoft C++的优化开关 42
2.4使用Microsoft Visual Studio设置编译器选项 43
2.4.1 Project Settings对话框中的General类型 45
2.4.2 Project Settings对话框中的Code Generation类型 46
2.4.5 Project Settings对话框中的Optimizations类型 48
2.4.4 Project Settings对话框中的Customize类型 48
2.4.3选择结构对齐方式 48
2.5建立发行版本的建议 51
2.6小结 51
第3章 逻辑与语法错误 53
3.1好的调试策略 55
3.2四种程序错误类型 56
3.2.1语法错误 56
3.2.2连接错误 57
3.2.3运行错误 58
3.3查看错误消息 60
3.2.4逻辑错误 60
3.4预防性维护 62
3.4.1桌面检查的含义 63
3.5异常处理设计 63
3.6“请多多支持” 64
3.7 Microsoft Visual C++的帮助 65
3.8小结 66
第4章 debugger 67
4.1确认Debugger可以使用 68
4.2启动Debugger 69
4.2.3 Run to Cursor 71
4.2.1 Step Into和Step Over的区别 71
4.2.2 Go 71
4.3理解Debugger工具栏图标 72
4.3.1 Restart 73
4.3.2 Stop Debugging 73
4.3.3 Break Execution 73
4.3.4 Apply Code Changes、Eidt and Continue 73
4.3.5 Show Next Statement 74
4.3.6 Step Into 74
4.3.11 Watch 75
4.3.10 QuickWatch 75
4.3.12 Variables 75
4.3.7 Step Over 75
4.3.8 Step Out 75
4.3.9 Run to Cursor 75
4.3.13 Regisers 76
4.3.14 Meomry 76
4.3.15 Call Stack 76
4.3.16 Disassembly 76
4.3.17 Debugger Toolbar Menu Equivalents 76
4.4.4 Modules 77
4.5.1 List Members 77
4.5本地菜单Debugger选项 77
4.4.1 Step Into Specific Function 77
4.4.3 Threads 77
4.4.2 Exceptions 77
4.4其他Debug菜单选项 77
4.5.2 Type Info 78
4.5.3 Parameter Information 78
4.5.4 Complete Word 78
4.5.7 Insert/Remove Breakpoint 79
4.6 Debugger窗口 79
4.5.5 Go To Definition/Reference 79
4.5.6 Go To Disassembly 79
4.6.1 Trace窗口 80
4.6.2 Watch窗口 80
4.7 View菜单和Debugger窗口 80
4.7.1 Workspace 80
4.7.2 Output 81
4.8以不同的数据类型查看观察变量 81
4.9打开Just-in-Time调试 83
4.10 Options窗口中的Debug标签 83
4.10.6 Parameter Types 84
4.10.10 Format 84
4.10.9 Address 84
4.10.8 Load COEF Exports 84
4.10.7 Return Value 84
4.10.1 Hexadecimal Display 84
4.10.5 Parameter Values 84
4.10.4 Symbols 84
4.10.3 Code Bytes 84
4.10.2 Source Annotation 84
4.10.16 Just-in-Time Debugging 85
4.10.17 OLE RPC Debugging 85
4.10.15 View Floating Point Registers 85
4.10.18 Debug Commands Invoke Edit and Continue 85
4.10.12 Show Data Bytes 85
4.10.14 Display Unicode Strings 85
4.10.13 Fixed Width 85
4.10.11 Re-evaluate Expression 85
4.11键盘映射 86
4.12 Debugger快捷键 87
4.13小结 87
第5章 调试版本与发行版本 89
5.2为调试版本建立修改工程设置 90
5.1缺省的调试版本建立与发行版本建立设置 90
5.2.1修改调试选项 91
5.2.2修改产生调试信息的格式 91
5.2.3产生一个映射文件 91
5.2.4重定向调试输入和输出 92
5.3什么是.pdb文件? 92
5.4什么是.dbg文件 93
5.5调试优化的代码 93
5.6打开Debugger的另一种方法 96
5.7使用基本版或调试版本 96
5.8 C/C++运行调试库 97
5.8.1旧版iostream.h和新版iostream之间的混乱 98
5.9连接器参考资料 99
5.10在调试版本中检测发行版本错误 101
5.10.1局部变量的自动初始化 101
5.10.2检查函数指针调用堆栈的合法性 102
5.10.3 检查调用堆栈的合法性 102
5.11 TRACE宏 102
5.12 VERIFT宏 103
5.13 移植Visual C++旧的32位版本 103
5.13.2与Visual C++以前的版本共存 104
5.13.1转换早期的32位工作空间和工程 104
5.14小结 105
第二部分 面向过程的环境 109
第6章 定位、分析和修复命令行代码错误 109
6.1快速启动调试 110
6.1.1启动Debugger的快速方法 112
6.1.2变量初始化跟踪 115
6.1.3小心调试代码 121
6.1.4快速查看变量的内容 124
6.1.6执行到代码的指定行 125
6.1.5中途停止Debugger 125
6.1.7全速执行到一个断点 127
6.1.8运行至光标处 128
6.1.9现在测试 128
6.2高级Debugger技巧 129
6.2.1使用新值运行 130
6.2.2循环调试技巧 141
6.2.3调用调试函数 142
6.2.4递归调用与调用堆栈 149
6.2.5查看反汇编代码 154
6.3进一步观察变量 157
6.3.1使用QuickWatch窗口 158
6.3.2使用Watch窗口 159
6.4小结 160
第7章 调试内联汇编语言代码 161
7.1汇编语言初步 162
7.1.1数据类型 162
7.1.2寄存器 163
7.1.3寻址模式 163
7.1.5协处理器 164
7.1.4指针 164
7.2调试 165
7.2.1减法运算 166
7.2.2使用256位整数 170
7.2.3程序循环 179
7.2.4使用协处理器求和实数 186
7.2.5使用协处理器计算正切值 190
7.3小结 199
第8章 在Windows 代码中定位、分析和修复错误 201
8.1使用两台计算机调试 202
8.1.1准备远程目标计算机 203
8.1.2准备主计算机 204
8.1.3启动调试会话 206
8.2简明Windows 入门 207
8.2.1基本的Windows 代码 208
8.2.2调试文件详述 209
8.2.3程序执行的情况 210
8.3调试 217
8.3.1一个动画位图程序 217
8.3.2使用鼠标绘画 233
8.4小结 248
第9章 定位、分析和修复命令行中的错误 251
第三部分 面向对象过程的环境 251
9.1高级调试工具 252
9.1.1内存卸出 252
9.1.2定位错误参数从何处传递而来 255
9.1.3查找何处修改了指针 257
9.2 ClassView窗口要素 267
9.2.1 ClassView窗口的Grouped by Access功能 269
9.2.2 ClassView窗口的Base Classes功能 270
9.2.4 ClassView窗口的 Derived Classes功能 273
9.2.3 ClassView窗口的References功能 273
9.2.5 ClassView窗口中菜单的其余项 275
9.2.6 ClassView窗口的Properities功能 276
9.2.7在ClassView窗口中添加文件夹 277
9.2.8在文件夹之间移动类 277
9.2.9隐藏或显示ClassView窗口 277
9.3调试argc和argv[] 278
9.4小结 282
第10章 使用MFC类库开发Windows 程序 283
10.1为什么使用类库 284
10.2一个真正的基础类——CObect 285
10.4一个图形程序 287
10.3什么是应用程序向导和类向导 287
10.4.1使用AppWizard 288
10.4.2使用ClassWizard 294
10.4.3建立AppWizard代码 295
10.4.4 AppWizard模板代码 296
10.4.5在客户区的图形对象 304
10.5剖面法 308
10.6小结 313
第11章 定位、分析和修复MFC Windows 代码中的错误 315
11.1内存问题 316
11.1.1有问题的代码 316
11.1.2定位和分析 320
11.1.3修复工程 328
11.2绘图问题 331
11.2.1有问题的代码 332
11.2.2定位和分析 336
11.2.3修改工程 344
11.3小结 348
第四部分 标准模板库(STL) 351
第12章 STL编程实践 351
12.1多体系结构 352
12.2掌握C++ 352
12.5 STL和HP公司 354
12.4初识STL 354
12.3 STL——进退维谷的数据结构 354
12.6大众化的STL 355
12.7 STL总览 355
12.8 ANSI/ISO C++接受STL的过程 355
12.9 STL基本组件 356
12.9.1什么是容器? 356
12.9.2什么是适配器? 357
12.9.3什么是算法? 358
12.9.4什么是迭代器? 358
12.10完整的STL程序包 359
12.9.5其他的STL组件 359
12.11杂乱的C/C++家族 361
12.12回顾数据结构 361
12.12.1静态与动态 361
12.12.2类型指针 362
12.12.3 void指针 363
12.13复习匈牙利命名法 365
12.14函数重载 367
12.15函数指针 367
12.16.1运算符和函数调用的重载 370
12.16运算符重载 370
12.16.2编写自己的重载运算符 371
12.17从结构到模板 373
12.17.1 template关键字 374
12.17.2模板语法 374
12.17.3模板函数 375
12.17.4模板类 375
12.18为什么STL比模板好 376
12.19小结 377
第13章 定位、分析和修复STL代码中的错误 379
13.1.1用迭代器遍历容器 380
13.1从标准C++转同STL语法的过程中出现的问题 380
13.1.2仔细研究迭代器 381
13.1.3流迭代器 382
13.1.4为什么使用end() 382
13.1.5复制列表 383
13.1.6列表中的列表 383
13.1.7 STL字符串指针的麻烦 384
13.1.8释放STL指针 385
13.2一个C++程序转变为STL语法的例子 385
13.2.1第一步——更新aSingleCard类 389
13.2.2第二步——更新WarDeck类 392
13.2.3第三步——修复STL代码的执行错误 396
13.2.4第四步——更新Opponent类 398
13.2.5第五步——运转的STL程序 399
13.3 STL语法的源文件wargame.cpp 400
13.4小结 405
第五部分 特殊的调试问题 409
第14章 使用DLL工作 409
14.1创建一个基于MFC的动态链接库 410
14.1.1头文件Framer.h 412
14.1.2源代码文件Framer.cpp 414
14.1.3建立Framer.dll 416
14.2创建使用DLL的主应用程序 417
14.2.1头文件DLLDemoView.h 418
14.2.2源代码文件DLLDemoView.cpp 419
14.3更加仔细地查看 425
14.3.1远程调试 425
14.3.2有问题的代码 428
14.3.3改正后的代码 432
14.4小结 433
第15章 使用ActiveX控件工作 435
15.1开发一个ActiveX控件 436
15.1.1使用ControlWizard 437
15.1.2 Test Container 440
15.1.3产生一个真实的Clock控件 443
15.2调试Clock控件 453
15.2.1准备远程目标计算机 453
15.2.2准备主计算机 454
15.2.3开始调试过程 454
15.2.4查找问题 456
15.3小结 459
第16章 调试COM、ATL和DHTML 461
16.1 COM对象模型 462
16.2创建一个ATL多边形工程 462
16.2.1优化模块代码 467
16.2.2测试控件 480
16.3调试ATL COM控件 482
16.4小结 484
第17章 STL和MFC编程 485
17.1产生一个STL和MFC应用程序 486
17.1.1复数 486
17.1.2模板语法 487
17.1.3基本的应用程序代码 493
17.2调试 497
17.3小结 505