这篇文章用来积累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: 找到一个或多个多重定义的符号
其它一些不可思议的问题:
断点无法停止:我遇到过几次,吃完饭回来就莫名其妙的好了
最后推荐一款程序员专用字体:YaHei ConSolas Hybrid 这款字体有三个好处:
1、等宽字体,对齐方便
2、字母O与数字0,字母b与数字6有明显区别
3、帅