vc++中的几种使用技巧.docx

上传人:b****4 文档编号:4873858 上传时间:2023-05-07 格式:DOCX 页数:15 大小:26.87KB
下载 相关 举报
vc++中的几种使用技巧.docx_第1页
第1页 / 共15页
vc++中的几种使用技巧.docx_第2页
第2页 / 共15页
vc++中的几种使用技巧.docx_第3页
第3页 / 共15页
vc++中的几种使用技巧.docx_第4页
第4页 / 共15页
vc++中的几种使用技巧.docx_第5页
第5页 / 共15页
vc++中的几种使用技巧.docx_第6页
第6页 / 共15页
vc++中的几种使用技巧.docx_第7页
第7页 / 共15页
vc++中的几种使用技巧.docx_第8页
第8页 / 共15页
vc++中的几种使用技巧.docx_第9页
第9页 / 共15页
vc++中的几种使用技巧.docx_第10页
第10页 / 共15页
vc++中的几种使用技巧.docx_第11页
第11页 / 共15页
vc++中的几种使用技巧.docx_第12页
第12页 / 共15页
vc++中的几种使用技巧.docx_第13页
第13页 / 共15页
vc++中的几种使用技巧.docx_第14页
第14页 / 共15页
vc++中的几种使用技巧.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

vc++中的几种使用技巧.docx

《vc++中的几种使用技巧.docx》由会员分享,可在线阅读,更多相关《vc++中的几种使用技巧.docx(15页珍藏版)》请在冰点文库上搜索。

vc++中的几种使用技巧.docx

vc++中的几种使用技巧

ZZ】vc中的使用技巧和常见错误

(2008-11-1720:

42:

23)

转载

标签:

杂谈

分类:

VC

1、在数据库操作时,将系统自动生成的CTime替换成COleDateTime。

 

2、在操作ACCESS数据库时,字符串的标识是:

单引号;日期/时间类型的标识是:

3、将 DDX_FieldDateTimeCtrl(pDX, IDC_PUBLISHDATE, m_pSet->m_publishDate,m_pSet);  替换成:

 

         DDX_DateTimeCtrl(pDX, IDC_PUBLISHDATE, m_pSet->m_publishDate); 

注:

这是VC6里的一个老BUG,好像SP6里也是那样。

 

4、遇到ClassView里的某个类突然丢失时可以把项目文件夹下的扩展名为.ncb和.opt的两个文件删掉,再重新打开项目。

 

     遇到类下的成员函数定位不准,即双击该函数时并不能准确定位到指定位置时,可以把debug或release(这要视你当时选择的MODE来定)下的扩展名为:

.pch的文件删掉;如还不行,就再把上面两个文件也一起删掉,再不行,,我也搞不定了,只好建议你跑出门去,对着天空大喊三声:

“神啊,救救我吧!

” 

5、如果你很喜欢VC6的auto-complete功能,而发觉他与系统的Ctrl+Space输入法冲突了,建议如下:

 

     Menu“Tools”->“Customize”->"Keyword",选择分类为:

"All commands",鼠标点击all commands里面,敲击“comple...”就出来了,在右侧重新添加一个“Shift+Space”并Assign就行了。

 

    这一点VC6要比delphi6好,在delphi6及以后的版本里,autocomplete功能已经做的很好了,当然以前的版本吗, autocomplete慢的跟什么似的,但很遗憾,我至今未找到能够自定义快捷方式的地方,好像只能用"Ctrl+Space",哪位大虾知道告诉我,另外delphi6下也可以Ctrl+J,这个VC6里没有,不过装了Visual Assist6就行了。

 

6、建议你使用VC6编辑的关键字颜色自定义功能,或者你可以使用Visual Assist6启动颜色功能。

即使你不喜欢自定义颜色,那有一个颜色,我还是建议你自定义一下:

 

Menu"Tools"->"OPtions"->"Format" 

Color:

Number  Foreground:

red,不然是很容易搞混:

'0'和'o'的,尤其是在VC6的默认字体下。

 

7.检测程序中的括号是否匹配  

    把光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”。

如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告声。

  

[注:

当一个函数体的内容过长时,全部选中,可以把光标移动到函数体的{处,按下Ctrl+},即可全部选中] 

8.查看一个宏(或变量、函数)的宏定义 

    把光标移动到你想知道的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的Go To Defition Of…),如果没有建立Browse files,会出现提示对话框,确定,然后就会跳到定义那些东西的地方。

 

[注:

这个功能还是比较常用的,不过感觉热键并不如鼠标选择的快] 

9格式化一段乱七八糟的源代码 

    选中那段源代码,按ATL+F8。

  

[注:

选中一段代码,按下Tab,或shift+Tab,右(或左)移一个TAb] 

10.在编辑状态下发现成员变量或函数不能显示 

    删除该项目扩展名为.ncb文件,重新打开该项目。

 

[注:

我上次说的不是很准确,.opt里面可能存有你在Classview新建的文件夹信息,删除的话那些分类文件夹信息也一并删除了] 

11.如何整理ClassView视图中大量的类 

    可以在classview 视图中右键新建文件夹(new folder),再把具有相近性质的类拖到对应的文件夹中,使整个视图看上去清晰明了。

 

[注:

事实上,我也见到在FileView里用文件夹分类的,我的感觉是:

可能是为了避免在Classviews里出现如上述的部分函数丢失的情况吧,毕竟VC6有时并不是很稳定,当然这两种方法各有利弊的,我目前一般是倾向于前者的] 

12.定位预处理指定 

    在源文件中定位光标到对称的#if, #endif,使用Ctrl+K。

 

13.如何添加系统中Lib到当前项目 

    在Project | Settings | Link | Object/library modules:

输入Lib名称,不同的Lib之间用空格格开。

 

[注:

或者这样,#pragma comment(lib,"yourlib.lib")] 

14.如何添加系统中的头文件(.h)到当前项目。

 

    #include ,告诉编译到VC系统目录去找;使用#include "FileName.h",告诉编译在当前目录找。

 

15.如何在Studio使用汇编调试 

    在WorkBench的Debugger状态下按CTRL+F7。

 

16.怎样处理ClassWiZard找不到的系统消息 

    如果要在ClassWizard中处理WM_NCHITTEST等系统消息,请在ClassWizard中Class Info页中将Message filter改为Window就有了。

 

[注:

主要是classwizard默认的是toponthemost] 

17.如何干净的删除一个类 

    先从Workspace中的FileView中删除对应的.h和.cpp文件,再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件与.clw文件。

 

18.如果让控制台应用程序支持mfc类库 

    可以在控制台应用程序中include 来引入mfc库,但是控制台应用程序缺省是单线程的,mfc是多线程的,为解决该矛盾,在project setting->c/c++ 选项,选择code generation,在use run-time library 下拉框中选择debug multithread。

 

19.如何汉化只有可执行代码的.exe 文件 

    在nt下利用vc open file 以resources方式打开*.exe 文件,直接修改资源文件,然后保存即可。

 

[注:

我一般是用exescope编辑的] 

附:

VC项目文件说明 

.opt 工程关于开发环境的参数文件。

如工具条位置等信息; 

.aps (AppStudio File),资源辅助文件,二进制格式,一般不用去管他; 

.clw ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重建; 

.dsp (DeveloperStudio Project):

项目文件,文本格式,不过不熟悉的话不要手工修改.dsw(DeveloperStudio Workspace)是工作区文件,其他特点和DSP差不多; 

.plg 是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件),一般用处不大.在Tools->Options里面有个选项可以控制这个文件的生成; 

.hpj (Help Project)是生成帮助文件的工程,用microsfot  Help Compiler可以处理;  

.mdp (Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式; 

.bsc 是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件.如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,可以加快编译速度; 

.map 是执行文件的映像信息纪录文件,除非对系统底层非常熟悉,这个文件一般用不着; 

.pch (Pre-Compiled File)是预编译文件,可以加快编译速度,但是文件非常大; 

.pdb (Program Database)记录了程序有关的一些数据和调试信息,在调试的时候可能有用; 

.exp 只有在编译DLL的时候才会生成,记录了DLL文件中的一些信息.一般也没什么用; 

.ncb 无编译浏览文件(no compile browser)。

当自动完成功能出问题时可以删除此文件。

build后会自动生成。

 

 

 

 

VC++的链接错误LNK2001

       学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。

产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。

  初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:

  unresolved external symbol “symbol”(不确定的外部“符号”)。

  如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。

一般来说,发生错误的原因有两个:

一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。

  以下是可能产生LNK2001错误的原因:

  一.由于编码错误导致的LNK2001。

  1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。

例如,如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。

  2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。

  3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。

  4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。

  5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。

  静态函数和静态变量具有相同的使用范围限制。

当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。

  函数内声明的变量(局部变量) 只能在该函数的范围内使用。

  C++ 的全局常量只有静态连接性能。

这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。

一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种方法是使用时给该变量赋以常数。

  二.由于编译和链接的设置而造成的LNK2001

  1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。

在这种情况下使用/NOD将导致错误LNK2001。

  2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。

  3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。

如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。

  4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。

  5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的问题。

  6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。

  7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。

如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。

为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。

  8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。

  其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初学者来说这些就够理解一阵子了。

但是,分析错误原因的目的是为了避免错误的发生。

LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能够避免和予以解决的。

 

 

问题1:

 

Linking... 

    nafxcwd.lib(thrdcore.obj) :

 error LNK2001:

 unresolved external symbol __endthreadex 

    nafxcwd.lib(thrdcore.obj) :

 error LNK2001:

 unresolved external symbol __beginthreadex 

    libcd.lib(crt0.obj) :

 error LNK2001:

 unresolved external symbol _main 

答 

    VC++默认的工程设置是单线程的,而你使用了多线程,所以要修改设置。

选择菜单“Project|settings”,选择C/C++标签,在CODE 

GENERATION分类中选择除SINGLE-THREADED的其他选择。

   比如可以在Use run-time library中选择Debug Multithreaded或者multithreaded

其中,

Single-Threaded                单线程静态链接库(release版本)

Multithreaded                  多线程静态链接库(release版本)

multithreaded DLL              多线程动态链接库(release版本)

Debug Single-Threaded          单线程静态链接库(debug版本)

Debug Multithreaded            多线程静态链接库(debug版本)

Debug Multithreaded DLL        多线程动态链接库(debug版本)

单线程:

 不需要多线程调用时, 多用在DOS环境下

多线程:

 可以并发运行

静态库:

 直接将库与程序Link, 可以脱离MFC库运行

动态库:

 需要相应的DLL动态库, 程序才能运行

release版本:

 正式发布时使用

debug版本:

 调试阶段使用

 

问题2

fatal error C1010:

 unexpected end of file while looking for precompiled header directive该如何解

    如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从

Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。

确定

    如果发生错误的文件原本是该工程中的,则检查该文件头部有没有#include "stdafx.h"语句,没有的话添加。

    如果还不行,也有可能是定义的类或结构体等最后忘了加分号,注意一下

 

问题3:

编译产生c1.exe什么原因?

编译器的问题

可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的“Compiling... ,Error spawning cl.exe”错误提示给郁闷过。

多人的选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的,“CL.exe”是VC使用真正的编译器(编译程序),其路径在

“VC根目录\VC98\Bin”下面,你可以到相应的路径下找到这个应用程序。

.2404633

因此问题可以按照以下方法解决:

点击VC“TOOLS(工具)”—>“Option(选择)”—>“Directories(目录)”重新设置“Excutable Fils

、Include Files、Library Files、Source Files”的路径。

很多情况可能就一个盘符的不同(例如你的VC装在C,但是这些路径全部在D),

改过来就OK了。

 

问题4:

关于工程类型的错误

libcmtd.lib(crt0.obj) :

 error LNK2001:

 unresolved external symbol _main

答:

 

 建了console工程,但是主函数写成了winmain,

 Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:

console改成/subsystem:

windows 

这样就把工程改该成了win32的工程,

如果要保留成console工程,只要把主函数改成main

 

问题5:

关于工程类型的错误

提示:

LIBCD.lib(wincrt0.obj) :

 error LNK2001:

 unresolved external symbol _WinMain@16

答:

 

 建了win32工程,但是主函数写成了main,

 控制台项目要使用Console子系统, 而不是Windows, 设置:

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:

windows改成/subsystem:

console

这样就把工程改成了console工程

如果要保留win32工程,只要把主函数改成winmain

 

问题6  程序入口设置错误, 提示:

msvcrtd.lib(crtexew.obj) :

 error LNK2001:

 unresolved external symbol _WinMain@16

通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口

:

[Project] --> [Settings] --> 选择"C/C++"属性页,

在Category中选择Output,

再在Entry-point symbol中填入wWinMainCRTStartup, 即可

 

 

问题7:

LNK2001错误,如error LNK2001:

 unresolved external symbol ………………

   一般这种错误是没有把需要的某些lib加到你的工程里面

   这里举个例子吧

   error LNK2001:

 unresolved external symbol __imp__waveOutGetNumDevs@0

 

   看到这种错误,去msdn查一下waveOutGetNumDevs这个函数,然后看最后的Requirements 

    Requirements 

    Windows NT/2000/XP:

 Included in Windows NT 3.1 and later.

    Windows 95/98/Me:

 Included in Windows 95 and later.

    Header:

 Declared in Mmsystem.h; include Windows.h.

    Library:

 Use Winmm.lib.

   于是把Winmm.lib 加到

   project ->setting->link->object/library modules

   或者#pragma comment(lib,"Winmm")//加了这个就不用到setting中再加lib了。

   关于这个LNK2001的错误,网上相关文章也比较多的,

   比如下面这段

   学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于

编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,

编译都已通过。

产生连接错误的原因非常多,尤其LNK2001错误,常常使人不

明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非

常困难。

  初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:

  unresolved external symbol “symbol”(不确定的外部“符号”)。

  如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或

标签,将产生此错误消息。

一般来说,发生错误的原因有两个:

一是所引用

的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本

的连接库。

  以下是可能产生LNK2001错误的原因:

  一.由于编码错误导致的LNK2001。

  1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。

例如, 

如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量

“VAR1”访问该变量,将发生该错误。

  2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定

义将导致LNK2001错误。

  3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生

LNK2001。

  4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。

  5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。

  静态函数和静态变量具有相同的使用范围限制。

当试图从文件外部访问

任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。

  函数内声明的变量(局部变量) 只能在该函数的范围内使用。

  C++ 的全局常量只有静态连接性能。

这不同于C,如果试图在C++的

多个文件内使用全局变量也会产生LNK2001错误。

一种解决的方法是需要时在

头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种

方法是使用时给该变量赋以常数。

  二.由于编译和链接的设置而造成的LNK2001

  1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行

库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含

这些库名,否则这些库不会被链接进工程文件。

在这种情况下使用

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2