• 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、帅

  • 相关阅读:
    统一身份认证(CAS)客户端测试获取信息代码
    常用的java工具类
    windows 批处理(bat)中执行程序后不等待直接退出(cmd中新进程执行程序)
    持续交付的八条原则,你能做到几条?(转)
    灵动标签调用栏目导航技巧
    .net网络编程(2)网络适配器
    Property Value Inheritance Tip(1)
    排序算法补充
    编码参考(Encoding)
    .net网络编程(3)Socket基础
  • 原文地址:https://www.cnblogs.com/easymind223/p/2575289.html
Copyright © 2020-2023  润新知