Visual Studio问题解答(不断更新)

这篇文章用来积累vs2005中的问题,把它们记录下来以方便以后的工作。

对于大部分编译器的bug来说,清理重新编译,重起电脑就可以解决了。以下是我遇到过的一些问题:

 

1.从VC6程序转到vs2005出现errors的问题:

(1)、VC6中变量的作用范围是整个函数,VS2005则是在大括号内,如果遇到for(i=0; i<n; i++)变量i未定义, 直接在前面加上int即可,如for(int i=0; i<n; i++)

(2)、VS2005的library与vc6有一些不同的,如fstream.h,这些问题只能自己改代码了。

(3)、VS2005的函数不能不写函数类型,而这在VC6是可以的,默认void

(4)、math.h中的一些函数在6中是整型的,在2005中变成了浮点型,如abs,sqrt等,在vs2005中变成了fabs,sqrtf

 

2.预编译头问题:

在项目属性-配置属性-c/c++-预编译头中,改变是否使用预编译头就行了。

 

3.控件不能添加消息响应,提示说:“无法执行添加/移除操作,因为代码元素是只读的

解决方法:

1、重启VC
2、关闭解决方案,删除ncb文件重新打开工程

 

4.如果你的磁盘格式是FAT32, 请在项目属性-配置属性-清单工具中选择使用FAT32解决办法,否则编译时可能出错

 

5.把CString转换到char* 之后,字符间多出一个空格,重启就好了。这个问题一直困扰着我,现在终于解决了。例如:

CString path = hFileDlg.GetPathName();

char* str = (LPSTR)(LPCTSTR)path 

path的内容是"d:/a.bmp",转换之后,str的内容变成了"d :  /a  .b m p",每个字符间多了一个空格。起初我不明白原因,就强制把这些空格删掉了,但是这样做带来了巨大的安全隐患。解决问题的方法是项目属性->配置属性->常规->字符集项选择“使用多字节字符集”,这样就可以了。因为在Unicode下,每个字符占两个字节,正是这个原因导致了先前的错误。而在ansi下,每个字符占一个字节。VC++有一种数据类型叫wchar_t,专门用来表示这种两个字节的字符,所以在CString转char*的时候,千万不要用上面的那种转换方式,这是很危险的,最好用如下的方式:

ansi下:char* str = path.GetBuffer(path.GetLength());

Unicode下:wchar_t* str = path.GetBuffer(path.GetLength());

有没有什么方法可以通吃这两种情况呢?有,答案就是TCHAR!当你的项目被作为Unicode编译的时,TCHAR将会被转换成wchar_t,若是是被作为ANSI/MBCS来编译,则会主动转换成char,同样的,比起应用strcpy,strlen,strcat(也包含以_s结尾的安然版本)或者wcscpy,wcslen,wcscat(安然版本也可),你可以简单的应用_tcscpy,tcslen,_tcscat 这些函数。

 

6.匹配之前遇到文件结束

遇到这个问题一定是不小心把哪个大括号注释掉了,少了一半才会匹配不上。错误很有可能出现在提示的行数之后不远的地方。

 

7.我的构造函数是空的,可是总提示“构造函数不能有返回类型”

类的定义最后要加分号

 

8.如何在release下调式程序

从网上下载的一些lib只支持release模式,但是在release模式下一些变量的值是看不到的,如何调式程序呢?

在当前工程点击右键选择properties,选择 All Configurations

C++>General->Debug Information Format->Program Database (/Zi)

C++>Optimization->Optimization->Disabled (/Od)

Linker->Debugging->Generate Debug Info->Yes (/DEBUG)

Linker->Debugging->Generate Program Database File->$(TargetDir)$(TargetName).pdb

 

9: 找到一个或多个多重定义的符号

一般情况是因为.h文件的全局变量,函数等被重复包含,解决方法有三个:
可以把变量声明成static,函数的话可以声明成inline,或者项目->属性->链接器->命令行->附加选项中加 /force可以解决问题,但会出现警告。
 
10.在using namespace std时显示“std”: 具有该名称的命名空间不存在
在前面加上#include <iostream>就好了
 
注意一点,有时候#include,using namespce 和#define的先后顺序非常重要,顺序的错误会导致大量bug
 
 

其它一些不可思议的问题:

断点无法停止:我遇到过几次,吃完饭回来就莫名其妙的好了

 

 

最后推荐一款程序员专用字体:YaHei ConSolas Hybrid 这款字体有三个好处:

1、等宽字体,对齐方便

2、字母O与数字0,字母b与数字6有明显区别

3、帅

posted @ 2012-07-03 20:23  汉泽的家  阅读(515)  评论(0编辑  收藏  举报