VS编程常见错误及解决⽅案总结
VS很强⼤,从经典的VC++ 6.0到VS2013、2015,甚⾄最新的VS 2019,功能越来越强⼤,使⽤越来越⽅便。但是,对于初学者却显得越来越不友好。
其实初学者使⽤VS时,不少问题往往只需要根据报错信息,搜索以下,就可以直接解决,今天我们就总结下VS编程中常见的报错信息及解决⽅案。
有正在学习C语⾔的朋友,可以进Q121811911下载软件资料和视频,我们⼀起进步。
未声明的标识符
error C2065: “cout”: 未声明的标识符
遇到这种情况,⽹上翻了好多,都是在说是由于缺失#include<iostream>和using namespace std;这两句导致的,但我明明这两句都有了,还是报错。最后发现,居然是预编译头,也就是#include"stdafx.h"必须放在第⼀⾏。
类型转换错误
*error C2440: “=”: ⽆法从“char ”转换为“int”
使⽤了不安全的函数
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C语⾔的标准函数中,⼀些读取或写⼊内存的函数存在内存越界的问题,从⽽使得内存数据变得不安全。如scanf、gets、strcat等函数都存在着这样的问题。
为了避免这个问题,在VS2015中,另外提供了如scanf_s,get_s,strcat_s等相关的改进函数,来替代原来的标准函数的功能,并通过添加内存读取范围的限制来解决不安全的问题。
在实际的应⽤中,也许使⽤VS2015提供的安全函数会更加合理。但是,在学习中,⼏乎所有的课本以及教程都使⽤的原来的标准函数,另外考虑到移植性的问题,除了VS2015环境,其他环境中并没有提供改进后的函数。因此,我们通常任然需要标准的库函数来实现相关功能。
但是,如果在VS2015中使⽤原始的函数,编译器将会报错。这对使⽤和学习都带来了相当的不变。
左操作数必须为左值
error C2106: “=”: 左操作数必须为左值
表达式由⼀个或多个操作数通过操作符组合⽽成。最简单的表达式仅包含⼀个字⾯值常量或变量。较复杂的表达式则由操作符以及⼀个或多个操作数构成。
不严谨的说法是,左值右值的区分在于位于等号的那⼀侧,左侧的是左值,通常是⼀个变量,右侧的是右值,可以是⼀个变量,或者是⼀个表达式。左值在编译时可知,左值表⽰存储结果的地⽅,所以简单理解,左值就是必须有存储结果的地⽅,有内存空间;⾄于C++可以运⾏成功是因为C++编译器已经优化过,表达事返回的并不是a的内容(b的内容) ,⽽是⼀个变量 。
需要我们对VS的项⽬属性进⾏设置,具体步骤如下。
1. 在项⽬属性设置中到选项卡配置属性→C/C++→预处理器;
2. 在右侧的参数中到预处理器定义,编辑其参数;
3. 在参数的末尾添加定义_CRT_SECURE_NO_WARNINGS
栈崩溃
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
主要问题是数组越界了,你定义了⼀个字符数组s,⼤⼩是2,然后试图给它赋值字符c和⼀个数字,⽽字符加⼀个数字已经是2了,每个字
符串末尾应该有个空字符的,但是放不下了,于是编译器很⽣⽓,就挂了,还有是变量s冲突,不是变量a冲突,⽽且你代码中也没有a这个
变量。改为char s[3]或者⼤于三都可以。
堆破坏
HEAP CORRUPTIONG DETECTED
这个错误的原因是,释放⼀个字符串指针,但是这个字符串指针被破坏了,举例说明:
char *str=(char *)malloc(sizeof(char)*10);//分配了10个字节⼤⼩的内存空间
strcpy(str,"1234567890");//字符串拷贝,字符串”1234567890“是11个字符,这个拷贝操作会破坏字符指针str,此时会拷贝11字节到str指向的内存空间⾥,超过了原来分
如果这时候⽤free(str);释放内存就会报错 ---HEAP CORRUPTION DETECTED
函数重复定义
*error C2084: 函数“char GetMyString(int,int)”已有主体
这是由于函数实现了两次引起的,双击出错的代码⾏⾃动定位到源代码中,删除重复的源代码。边删除边编译检测还有没有重复实现的函
数。删除完所有重复定义的函数后再次编译即可避免此类错误。
函数链接错误
vs编程软件LINK : fatal error LNK1104: ⽆法打开⽂件“opencv-user.lib”
或者
error LNK2019: ⽆法解析的外部符号 "void __cdecl test(void)" (?test@@YAXXZ),该符号在函数 _main 中被引⽤
遇到这种问题⼀般都是由于缺少相应的库⽂件;右击项⽬,选择“属性”--“链接器”--“输⼊”--“附加依赖项”
根据错误中的提⽰在下图右边的红⾊框内添加相应的lib⽂件。
预编译头问题
fatal error C1853: “Debug\NR302.pch”预编译头⽂件来⾃编译器的早期版本,或者预编译头为 C++ ⽽在 C 中使⽤它(或相反)
该错误是因为当项⽬中混合了 .cpp 和 .c ⽂件时,编译器会对它们采取不同的编译⽅式(主要是因为对函数声明的处理⽅式不同),因⽽不
能共⽤⼀个预编译头⽂件。在 VC++ 中,默认的预编译头⽂件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编
译头。
⽅法:将少数的不同类⽂件设为不使⽤预编译头是⽐较平衡的做法,⽅法是:对于 VC++6.0,在 FileView ⾥对要取消预编译头的 .c (或
.cpp) ⽂件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;(对于
VS2005,则在 solution explorer 中对相应⽂件点右键选择 properties,在 precompiled headers 项下设置 即可。如果
需要设置多个⽂件,则可以按住 Ctrl 键再同时选中这些⽂件并设置)PS:解释如下点击项⽬ 点击属性 然后选择C/C++ 预编译头 创建使
⽤头⽂件 不使⽤预编译头⽂件(解决⽅案资源管理器-右击需要排除的c或cpp⽂件]-弹出属性菜单-展开C/C++-预编译头-创建/使⽤预编译
头-选择不适⽤预编译头)
⼤部分是⾃⼰学习遇到的问题,有些答案收集⾃⽹络,我也刚起步。有正在学习C语⾔的朋友,可以进Q121811911下载软件资料和视
频,我们⼀起进步吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论