http://www.tuicool.com/articles/I3mQNf
所谓:“工欲善其事,必先利其器”。如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢?
先来看一下VC的处理流程,大致分为两步:编译和连接。源文件通过编译生成了.obj文件;所有.obj文件和.lib文件通过连接生成.exe文件或.dll文件。
左边的列表可以选择要设置的工程编译方式( Debug 或 Release ),如果多个工程,还可以选择要设置的工程。右边是一个属性页,内容十分丰富,依次是: General , Debug , C/C++ , Link , Resource , MIDL , Browse Info , Custom Build , Pre-link Step , Post-build step
编译参数的设置。主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:
/nologo /MDd /W3 /Gm /GX /ZI /Od /D “WIN32″ /D “_DEBUG” /D “_WINDOWS” /D “_AFXDLL” /D “_MBCS” /Fp”Debug/WritingDlgTest.pch” /Yu”stdafx.h” /Fo”Debug/” /Fd”Debug/” /FD /GZ /c
各个参数代表的意义,可以参考Msdn,文章后面有解释。
1.Warninig level 警告级别, VC 默认为 3 ,一般不更改,等级越低,对代码的要求就越严格。
2.Optimizations Optimizations 优化级别, Debug 下默认设置为 Disable(Debug) ,就是不优化,在 Release 下默认设置为 Maximize Speed ,就是最大速度优化。在追求效率或者编译结果的时候可以选择最大速度或最小尺寸的选项,不过微软不保证优化的准确性。
3.Waring as error 不用多说了,经常忽略警告的人不会选这项吧。最好别选,否则你会烦死。
4.Generate browse info 用以生成 .sbr 文件,记录类、变量等符号信息,可以在 Category 的 Listing Files 项中进行更多的设置。产生浏览信息,在编辑调试加了一些功能,会产生很大的编译文件,建议不要选
5.Debug info 生成调试信息,选择调试信息的详细程度,在 debug 情况下,一般选择 Program DataBase 或 Program DataBase for Editon and continue 二者区别在于后者可以在调试过程中,修改代码后,部分编译后,在当前环境继续执行,虽然功能很强,建议还是用前者吧。 Release 一般选择 None 。
None ,不产生任何调试信息(编译比较快);
Line Numbers Only ,仅生成全局的和外部符号的调试信息到 .OBJ 文件或 .EXE 文件,减小目标文件的尺寸;
C 7.0- Compatible ,记录调试器用到的所有符号信息到 .OBJ 文件和 .EXE 文件;
Program Database ,创建 *.pdb 文件记录所有调试信息;
Program Database for Edit and Continue ,创建 *.pdb 文件记录所有调试信息,并且支持调试时编辑。
6.Preprocessor definitions 预定义宏, Defines a preprocessing symbol for your source file ,相当于全局【 #define 】。提示: 一般定义了 UNICODE _UNICODE 则认为是使用 unicode 编码,没定义则认为是 MBCS 。
-pointer_to_member representation用来设置类定义/引用的先后关系,一般为Best-Case Always表示在引用类之前该类肯定已经定义了;
-Enable Exception Handling,进行同步的异常处理;
-Enable Run-Time Type Information迫使编译器增加代码在运行时进行对象类型检查;
-Disable Construction Displacements,设置类构造/析构函数调用虚函数问题。
-Processor表示代码指令优化,可以为80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各种优化。
-Use run-time library用以指定程序运行时使用的运行时库(单线程或多线程,Debug版本或Release版本),有一个原则就是,一个进程不要同时使用几个版本的运行时库。
Single-Threaded,静态连接LIBC.LIB库;
Debug Single-Threaded,静态连接LIBCD.LIB库;
Multithreaded,静态连接LIBCMT.LIB库;
Debug Multithreaded,静态连接LIBCMTD.LIB库;
Multithreaded DLL,动态连接MSVCRT.DLL库;
Debug Multithreaded DLL,动态连接MSVCRTD.DLL库。连接了单线程库就不支持多线程调用,连接了多线程库就要求创建多线程的应用程序。
-Calling convention可以用来设定调用约定,有三种:__cdecl、__fastcall和__stdcall。各种调用约定的主要区别在于,函数调用时,函数的参数是从左到右压入堆栈还是从右到左压入堆栈;在函数返回时,由函数的调用者来清理压入堆栈的参数还是由函数本身来清理;以及在编译时对函数名进行的命名修饰(可以通过Listing Files看到各种命名修饰方式)。
-Struct member alignment用以指定数据结构中的成员变量在内存中是按几字节对齐的,根据计算机数据总线的位数,不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要,不是存取速度问题,而是数据位的精确定义问题,一般在程序中使用#pragma pack来指定。
1.Disable language extensions 禁止语言扩展 (Microsoft Extensions to C) ,表示不使用微软为标准 C 做的语言扩展。
2.Eliminate Duplicate Strings 主要用于字符串优化(将字符串放到缓充池里以节省空间),使用这个参数,使得
char *sBuffer = “This is a character buffer”;
char *tBuffer = “This is a character buffer”;
sBuffer 和 tBuffer 指向的是同一块内存空间;
3.Enable Function-Level Linking 告诉编译器将各个函数按打包格式编译;
4.Enables minimal rebuild ,通过保存关联信息到 .IDB 文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度;
5.Enable Incremental Compilation ,同样通过 .IDB 文件保存的信息,只重编译最新改动过的函数;
6.Suppress Startup Banner and Information Messages 设置预编译文件( pch )的存放路径及(或)文件名,在 Project Options 中配置。用以控制参数是否在 output 窗口输出。
Generate browse info的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Variables from Browse Info表示是否将局部变量的信息放到.SBR文件中。Listing file type可以设置生成的列表信息文件的内容:Assembly-Only Listing仅生成汇编代码文件(.ASM扩展名);Assembly With Machine Code生成机器代码和汇编代码文件(.COD扩展名);Assembly With Source Code生成源代码和汇编代码文件(.ASM扩展名);Assembly, Machine Code, and Source生成机器码、源代码和汇编代码文件(.COD扩展名)。Listing file name为生成的信息文件的路径,一般为Debug或Release目录下,生成的文件名自动取源文件的文件名。
代码优化设置。可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。定制的内容包括:
Assume No Aliasing,不使用别名(提高速度);
Assume Aliasing Across Function Calls,仅函数内部不使用别名;
Global Optimizations,全局优化,比如经常用到的变量使用寄存器保存,或者循环内的计算优化,如
i = -100;
while( i < 0 ){ i += x + y;}
会被优化为
i = -100;
t = x + y;
while( i < 0 ){i += t;}
Generate Intrinsic Functions,使用内部函数替换一些函数调用(提高速度);
Improve Float Consistency,浮点运算方面的优化;
Favor Small Code,程序(exe或dll)尺寸优化优先于代码速度优化;
Favor Fast Code,程序(exe或dll)代码速度优化优先于尺寸优化;
Frame-Pointer Omission,不使用帧指针,以提高函数调用速度;
Full Optimization,组合了几种参数,以生成最快的程序代码。
Inline function expansion,内联函数扩展的三种优化(使用内联可以节省函数调用的开销,加快程序速度):Disable不使用内联;Only __inline,仅函数定义前有inline或__inline标记使用内联;Any Suitable,除了inline或__inline标记的函数外,编译器“觉得”应该使用内联的函数,都使用内联。
预编译头文件的设置。使用预编译可以提高重复编译的速度。VC一般将一些公共的、不大变动的头文件(比如afxwin.h等)集中放到stdafx.h中,这一部分代码就不必每次都重新编译(除非是Rebuild All)。
预编译处理。可以定义/解除定义一些常量。Additional include directories,可以指定额外的包含目录,一般是相对于本项目的目录,如..\Include。
连接参数的设置。主要通过VC的菜单项Project->Settings->Link页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:
/nologo /subsystem:windows /incremental:yes /pdb:”Debug/WritingDlgTest.pdb” /debug /machine:I386 /out:”Debug/WritingDlgTest.exe” /pdbtype:sept
下面我们分别来看一下Category中的各项设置。
1.Output file name 输出文件名称,支持相对路径
2.Object/library module 工程所需要的 lib ,默认当前路径
3.Generate debug info 产生 debug 信息。生成 Debug 信息到 *.pdb 文件(具体格式可以在 Category->Debug 中设置), Debug 默认为 true , Release 默认为 false
4.Ignore All Default Libraries 放弃所有默认的库连接
5.Link incrementally 增量连接,必须选择 Program database 选项,提高编译连接的速度,通过生成 . ILK 文件实现递增式连接以提高后续连接速度,但一般这种方式下生成的文件( EXE 或 DLL )较大
6.Generate Mapfile 生成 *.map 文件记录模块相关信息
7.Enable profiling 允许程序以 profiling 启动,可以测试程序的效率等
1.Use program database 允许使用程序数据库,这样连接器会把调试信息放在程序数据库中,如果不选中该选项,那么也不能使用递增连接方式
2.Force File Output 强制产生输出文件( EXE 或 DLL ) , 即使某个模块引用了一些未定义或者重复定义的符号,连接器仍然会强制(但不一定能正确运行)产生输出文件( EXE 或 DLL )
3.Print Progress Messages 可以将连接过程中的进度信息输出到 Output 窗口
设置是否生成调试信息,以及调试信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三种选择;Separate Types,表示将Debug格式信息以独立的.PDB文件存放,还是直接放在各个源文件的.PDB文件中。选中的话,表示采用后者的方式,这种方式调试启动比较快。
这里可以指定要连接的库文件,放弃连接的库文件。还可以增加额外的库文件目录,一般是相对于本项目的目录,如..\Lib。Force Symbol References,可以指定连接特定符号定义的库。
1.Base Address 可以改变程序默认的基地址( EXE 文件默认为 0x400000 , DLL 默认为 0x10000000 ),操作系统装载一个程序时总是试着先从这个基地址开始
2.Entry-Point Symbol 可以指定程序的入口地址,一般为一个函数名(且必须采用 __stdcall 调用约定)。一般 Win32 的程序, EXE 的入口为 WinMain , DLL 的入口为 DllEntryPoint ;最好让连接器自动设置程序的入口点。默认情况下,通过一个 C 的运行时库函数来实现:控制台程序采用 mainCRTStartup ( 或 wmainCRTStartup) 去调用程序的 main ( 或 wmain) 函数; Windows 程序采用 WinMainCRTStartup ( 或 wWinMainCRTStartup) 调用程序的 WinMain ( 或 wWinMain ,必须采用 __stdcall 调用约定 ) ; DLL 采用 _DllMainCRTStartup 调用 DllMain 函数(必须采用 __stdcall 调用约定)
3.Stack allocations 用以设置程序使用的堆栈大小(请使用十进制) , 默认为 1 兆字节。
4.Version Information 告诉连接器在 EXE 或 DLL 文件的开始部分放上版本号
值得注意的是,上面各个参数是大小写敏感的;在参数后加上 “-” 表示该参数无效;各个参数值选项,有 “*” 的表示为该参数的默认值;可以使用页右上角的 “Reset” 按钮来恢复该页的所有默认设置。
1) Project->Settings->General(常规),可以设置连接MFC库的方式(静态或动态)。如果是动态连接,在你的软件发布时不要忘了带上MFC的DLL。
2) Project->Settings->Debug,可以设置调试时运行的可执行文件,以及命令行参数等。
3) Project->Settings->Custom Build(自定义组建),可以设置编译/连接成功后自动执行一些操作。比较有用的是,写COM时希望VC对编译通过的COM文件自动注册,可以如下设置:
Description: Register COM
Commands: regsvr32 /s /c (TargetPath)echoregsvr32exe.time> (TargetDir)$(TargetName).trg
Outputs: $(TargetDir)\$(TargetName).trg
4) Tools->Options->Directories,设置系统的Include、Library路径。
1) 有时候,你可能在编译的时候,计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因)。当你重启机器后打开刚才的项目,重新进行编译,发现VC会崩掉。你或许以为你的VC编译器坏了,其实不然(你试试编译其它项目,还是好的!),你只要将项目的.ncb、.opt、.aps、.clw文件以及Debug、Release目录下的所有文件都删掉,然后重新编译就行了。
2) 如果你想与别人共享你的源代码项目,但是把整个项目做拷贝又太大。你完全可以删掉以下文件:.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目录下的所有文件。
3) 当你的Workspace中包含多个Project的时候,你可能不能直观地、一眼看出来哪个是当前项目。可以如下设置:Tools->Options->Format,然后在Category中选择Workspace window,改变其默认的字体(比如设成Fixedsys)就行了。
4) 如何给已有的Project改名字?将该Project关掉。然后以文本格式打开.dsp文件,替换原来的Project名字即可。
5) VC6对类成员的智能提示功能很有用,但有时候会失灵。你可以先关掉项目,将.clw和.ncb删掉,然后重新打开项目,点击菜单项View->ClassWizard,在弹出的对话框中按一下“Add All”按钮;重新Rebuild All。应该可以解决问题
6)如何解决unexpected end of file while looking for precompiled header directive的问题?右键点工程名,选设置,然后选c/c++属性页,再选catagory选单中选 precompiled header ,将选项置成no use 或者autometic
编译选项对编程人员有时候是相当的模糊,下面对其做个总结:
visual studio
/Od 禁用优化(默认值) disable optimizations (default)
/Ox 最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)
/Og 启用全局优化 enable global optimization
/Oy[-] 启用框架指针省略 enable frame pointer omission
/Oi 启用内建函数 enable intrinsic functions
-代码生成-
/G3 为 80386 进行优化 optimize for 80386
/G4 为 80486 进行优化 optimize for 80486
/GR[-] 启用 C++ RTTI enable C++ RTTI
/G5 为 Pentium 进行优化 optimize for Pentium
/G6 为 Pentium Pro 进行优化 optimize for Pentium Pro
/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/GD 为 Windows DLL 进行优化 optimize for Windows DLL
/GB 为混合模型进行优化(默认) optimize for blended model (default)
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH
/Gd __cdecl 调用约定 __cdecl calling convention
/EHc extern“C”默认为 nothrow extern “C” defaults to nothrow
/Gr __fastcall 调用约定 __fastcall calling convention
/Gi[-] 启用增量编译 enable incremental compilation
/Gz __stdcall 调用约定 __stdcall calling convention
/Gm[-] 启用最小重新生成 enable minimal rebuild
/GA 为 Windows 应用程序进行优化 optimize for Windows Application
/Gf 启用字符串池 enable string pooling
/QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix
/GF 启用只读字符串池 enable read-only string pooling
/QI0f[-] 启用 Pentium 0x0f 修复 enable Pentium 0x0f fix
/Gy 分隔链接器函数 separate functions for linker
/GZ 启用运行时调试检查 enable runtime debug checks
/Gh 启用钩子函数调用 enable hook function call
/Ge 对所有函数强制堆栈检查 force stack checking for all funcs
/Gs[num] 禁用堆栈检查调用 disable stack checking calls
-输出文件-
/Fa[file] 命名程序集列表文件 name assembly listing file
/Fo 命名对象文件 name object file
/FA[sc] 配置程序集列表 configure assembly listing
/Fp 命名预编译头文件 name precompiled header file
/Fd[file] 命名 .PDB 文件 name .PDB file
/Fr[file] 命名源浏览器文件 name source browser file
/Fe 命名可执行文件 name executable file
/FR[file] 命名扩展 .SBR 文件 name extended .SBR file
/Fm[file] 命名映射文件 name map file
-预处理器-
/FI 命名强制包含文件 name forced include file
/C 不吸取注释 don’t strip comments
/U 移除预定义宏 remove predefined macro
/D{=|#} 定义宏 define macro
/u 移除所有预定义宏 remove all predefined macros
/E 将预处理定向到标准输出 preprocess to stdout
/I 添加到包含文件的搜索路径 add to include search path
/EP 将预处理定向到标准输出,不要带行号 preprocess to stdout, no #line
/X 忽略“标准位置” ignore “standard places”
/P 预处理到文件 preprocess to file
-语言-
/Zi 启用调试信息 enable debugging information
/Zl 忽略 .OBJ 中的默认库名 omit default library name in .OBJ
/ZI 启用调试信息的“编辑并继续”功能 enable Edit and Continue debug info
/Zg 生成函数原型 generate function prototypes
/Z7 启用旧式调试信息 enable old-style debug info
/Zs 只进行语法检查 syntax check only
/Zd 仅要行号调试信息 line number debugging info only
/vd{0|1} 禁用/启用 vtordisp disable/enable vtordisp
/Zp[n] 在 n 字节边界上包装结构 pack structs on n-byte boundary
/vm 指向成员的指针类型 type of pointers to members
/Za 禁用扩展(暗指 /Op) disable extensions (implies /Op)
/noBool 禁用“bool”关键字 disable “bool” keyword
/Ze 启用扩展(默认) enable extensions (default)
-链接-
/MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB
/MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib
/ML 与 LIBC.LIB 链接 link with LIBC.LIB
/MLd 与 LIBCD.LIB 调试库链接 link with LIBCD.LIB debug lib
/MT 与 LIBCMT.LIB 链接 link with LIBCMT.LIB
/MTd 与 LIBCMTD.LIB 调试库链接 link with LIBCMTD.LIB debug lib
/LD 创建 .DLL Create .DLL
/F 设置堆栈大小 set stack size
/LDd 创建 .DLL 调试库 Create .DLL debug libary
/link [链接器选项和库] [linker options and libraries]
小知识:
1.Release 和 Debug 有什么不同
Release 版称为发行版, Debug 版称为调试版。
Debug 中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。 Release 版运行速度较快,可执行文件较小,但在其编译条件小无法执行调试功能。
Release 的 exe 文件链接的是标准的 MFC DLL(Use MFC in a shared or static dll), 比如 MFC42.DLL 。这些 DLL 在安装 Windows 的时候,已经配置,所以这些程序能够在没有安装 Visual C++ 6.0 的机器上运行。而 Debug 版本的 exe 链接了调试版本的 MFC DLL 文件,如 MFC42D.DLL 。在没有安装 Visual C++6.0 的机器上不能运行,因为缺 MFC42D.DLL 等,除非选择 use static dll when link 。
2.ASSERT 和 VERIFY 有什么区别
ASSERT 里面的内容在 Release 版本中不编译, VERIFY 里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。
例如 ASSERT(file.Open(strFileName)) 。
一旦到了 Release 版本中,这一行就忽略了, file 根本就不 Open() 了,而且没有任何出错的信息。如果用 VERIFY() 就不会有这个问题。
3.Workspace 和 Project 之间是什么样的关系
每个 Workspace 可以包括几个 project ,但只有一个处于 Active 状态,各个 project 之间可以有依赖关系,在 project 的 Setting.. 中可以设定,比如那个 Active 状态的 project 可以依赖于其他的提供其函数调用的静态库。
在工程目录下新建一个空的 .RC 文件,然后加入到工程中就可以了。
这似乎是目前这个 Visual C++ 6.0 版本的一个 bug ,可按如下步骤使其正常,如再出现,可如法炮制:
(1) 关闭 Project
(2) 删除 “ 工程名 .ncb” 文件
(3) 重新打开工程
首先在工作区的 FileView 中选中该类的 .h 和 .cpp 文件,按 delete 删除,然后在文件管理器中将这两个文件删除,再运行 ClassWizard ,这时出现是否移走该类的提示,选择 remove 就可以了。
打开该类对应的头文件,然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。
单击菜单【 Project 】- > 【 Settings… 】弹出 “Project Setting” 对话框,切换到 “Link” 标签页,在 “Object/library modules” 处输入 Lib 文件名称,不同的 Lib 之间用空格格开。
在工作区的 FileView 视图中选中对应的项目,单击右键弹出菜单,选择【 Clean(selection only) 】菜单即可
在新建工程的 “New” 对话框中选择 “Custom Appwizard” 项,输入新工程的名字,单击【 OK 】按钮。出现 “Custom AppWizard” 项,输入新工程的名字,单击【 OK 】按钮。出现 “Custom AppWizard - Step 1 of 2” 对话框,选择 “An existing Project” 项,单击【 Next 】按钮。出现 “Custom AppWizard - Step 2 of 2” 对话框,选择现有工程的工程文件名,最后单击【 Finish 】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程 AppWizard 。
现在就可以项用 MFC AppWizard 一样用这个定制的向导。如果不想用了,可以在 Visual C++ 6.0 安装目录下 Common\MSDev98\Template 目录中删除该 Wizard 对应的 .awx 和 .pdb 文件。
情景:明明之间改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,有提示重新编译链接一次。
这是因为出现了未来文件 ( 修改时间和创建时间比系统时间晚 ) 的缘故。可以这样处理:找到工程文件夹下的 debug 目录,将创建和修改时间都比系统时间晚的文件全部删除,然后再从新 “Rebuild All” 一次。
12.Visual C++ 6.0 工程中的项目文件都表示什么。
.opt :工程关于开发化境的参数文件。如工具条位置等信息。
.aps(AppStudio File) 资源辅助文件,二进制格式,一般不用去管他。
.clw : ClassWizard 信息文件,实际上是 INI 文件格式,又兴趣可以研究一下。有时候 ClassWizard 出了问题,手工修改 CLW 文件可以解决。如果此文件不存在的话,每次用 ClassWizard 的时候回提示是否重建。
.dsp(DevelopStudio Project) :项目文件,文本格式,不过不熟悉的或不要手工修改。
.dsw(DevelopStudio Workspace) :是工作区文件,其他特点和 .dsp 差不多。
.plg :是编译信息文件,编译时的 error 和 warning 信息文件 ( 实际上时一个 html 文件 ) ,一般用处不大。在单击菜单【 Tool 】 -> 【 Option 】弹出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project) :是生成帮助文件的工程,用 microsoft Help Compiler 可以处理。
.mdp(Microsoft DevStudio Project) :是旧版本的项目文件,如果要打开此文件的话,回提示你是否转换成新的 .dsp 格式。
.bsc :是用于浏览项目信息的,如果用 Source Brower 的话就必须又这个文件。如果不用这个功能的话,可以在 Project Options 里面去掉 Generate Browse Info File ,这样可以加快编译速度。
.map 是执行文件的影像信息记录文件,除非对系统底层,这个文件一般用不着。
.pch(Pre-Compiled File) :是与编译文件,可以加快编译速度,但是文件非常大。
.pdb(Program Database /C: 在预处理输出中保留注释语句 ) : 记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
.exp :只有在编译 DLL 的时候才会生成,记录了 DLL 文件的一些信息,一般也没有用。
.ncb :无编译浏览文件 (no compile browser) 。当自动完成功能出问题时可以删除此文件。编译工程后回自动生成。
完全可以删掉以下文件: .dsw 、 .ncb 、 .opt 、 .aps 、 .clw 、 . plg 文件以及 Debug 、 Release 目录下的所有文件。
如何给已有的 Project 改名字?将该 Project 关掉。然后以文本格式打开 .dsp 文件,替换原来的 Project 名字即可。
15 . VC6 对类成员的智能提示功能很有用,但有时候会失灵。你可以先关掉项目,将 .clw 和 .ncb 删掉,然后重新打开项目,点击菜单项 View->ClassWizard ,在弹出的对话框中按一下“ Add All ”按钮;重新 Rebuild All 。应该可以解决问题。