VS编程常见错误及解决方案总结

VS很强大,从经典的VC++ 6.0到VS2013、2015,甚至最新的VS 2019,功能越来越强大,使用越来越方便。但是,对于初学者却显得越来越不友好。

其实初学者使用VS时,不少问题往往只需要根据报错信息,搜索以下,就可以直接解决,今天我们就总结下VS编程中常见的报错信息及解决方案。

有正在学习C语言的朋友,可以进Q群121811911下载软件资料和视频,我们一起进步。

未声明的标识符

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指向的内存空间里,超过了原来分配的10个字节大小的内存空间

如果这时候用free(str);释放内存就会报错 ---HEAP CORRUPTION DETECTED

函数重复定义

*error C2084: 函数“char GetMyString(int,int)”已有主体

这是由于函数实现了两次引起的,双击出错的代码行自动定位到源代码中,删除重复的源代码。边删除边编译检测还有没有重复实现的函数。删除完所有重复定义的函数后再次编译即可避免此类错误。

函数链接错误

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 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置)PS:解释如下点击项目 点击属性 然后选择C/C++ 预编译头 创建使用头文件 不使用预编译头文件(解决方案资源管理器-右击需要排除的c或cpp文件]-弹出属性菜单-展开C/C++-预编译头-创建/使用预编译头-选择不适用预编译头)

大部分是自己学习遇到的问题,有些答案收集自网络,我也刚起步。有正在学习C语言的朋友,可以进Q群121811911下载软件资料和视频,我们一起进步吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,318评论 0 2
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,724评论 0 38
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 2,893评论 0 6
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,141评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32