VS2010与VC++6.0的各种区别和移植代码问题总结
- 格式:docx
- 大小:26.62 KB
- 文档页数:11
对了,VC6的工程,转换为VS2010或VS2013工程之后,需要进行一些设置:
1、工程属性 -》C/C++ -》语言-》将wchar_t视为内置类型:设置为否
2、工程属性 -》链接器 -》高级-》映像具有安全异常处理程序:设置为否 (/SAFESEH:NO)
3、如果需要在C++异常里面,即try...catch...里面,捕获SEH异常(如非法地址访问、除零等),则需要在
工程属性 -》C/C++ -》代码生成-》启用C++异常:设置为“是,但有 SEH 异常(/EHa)”
4、添加对库文件crtnew.lib的引用
最后,如果在构建Release模式的程序的时候,出现了_CrtDbgReport相关的链接错误,则在你的代码中的任意地方,调用一次声明在crtnew.h中的CRTNEW_RESOLVE_CRTDBGREPORT_LINK_ERROR() 宏,即可解决此链接错误。
1.编译错误C20651>c:¥documents and settings¥administrator¥桌面¥host_sp3¥selectdialog.cpp(62): errorC2065: “i”: 未声明的标识符解决办法,将for (int i = 0; i < m_deviceList.size(); i++){m_ctlDevicelist.AddString(m_deviceList[i]);}中变量i的定义放到函数体开头int i;for (i = 0; i < m_deviceList.size(); i++){m_ctlDevicelist.AddString(m_deviceList[i]);}2.链接错误LNK2019odbccp32.lib(dllload.obj) : error LNK2019: 无法解析的外部符号__imp___vsnprintf,该符号在函数_StringVPrintfWorkerA@20 中被引用odbccp32.lib是在程序中对数据库操作时用到的,这个链接问题在使用静态DLL方式时才会遇到,如果使用共享DLL方式时不会出现,但是因为本程序需要使用静态DLL方式,所以继续尝试其他的解决方法。
尝试在程序属性的连接器输入选项中添加附加依赖项odbccp32.lib,依然报错。
于是在系统中搜索这个lib文件,最终找到了两种不同版本的odbccp32.lib。
VC6.0中文件信息:C:¥Program Files¥Microsoft Visual Studio¥VC98¥Lib¥ODBCCP32.LIBVS2010中文件信息:C:¥Program Files¥Microsoft SDKs¥Windows¥v7.0A¥Lib¥odbccp32.lib从文件信息中可以看出两个文件的版本大小都不同。
1.程序开发过程中出现的错误类型我们在进行程序设计时,不可避免地会犯错误。
程序中的错误可以分为三类:编译错误、运行时错误和逻辑错误。
1.1编译错误编译错误(Compile errors)又称为编译时错误(Compiling-time errors): 是由于错误的编码产生的。
例如关键字拼写错误、将中文标点符号当成英文符号使用、遗漏了某些必要的标点符号或者使用了一个没有定义的标识符。
编译错误一般都是语法错误,当编译器对程序进行语法检查时,都能发现这些错误,并能够指出产生错误的位置(标出行号)。
我们可以根据编译出错信息指出的行号找到对应的源代码行改正错误,重新编译源程序。
只有当所有的编译错误被改正后,才能通过编译检查,产生目标代码文件。
改正编译错误的关键是要能正确理解编译器给出的编译错误信息。
VC++环境中的编译、链接错误信息是用英文表示的。
对于英文基础薄弱的读者,可以参考本实验指导书后面的“VC++编译、链接常见错误和警告信息中英文对照”。
通常情况下,一个语法错误可能产生多条编译错误信息,这是由于株连错误造成的,建议读者在处理编译错误时,找到第一个出现错误的位置改正后重新编译。
这样能够避免被株连错误迷惑。
值得指出的是,现在大部分编译器对错误的定位不精确,如果在编译器指出的行没有发现错误,应该向前查找错误。
例如,当提示第10行发生错误时,如果在第10行没有发现错误,请从第10行开始往前查找错误并修改之。
1.2运行时错误运行时错误(Run-time errors)是在程序的运行阶段出现的,当运行环境检测到程序的某些操作无法执行,例如除数为零时,就会出现运行时错误。
当运行环境检测到程序的某些操作是被禁止的,也会产生运行时错误。
例如,访问数组时超越数组的边界,空指针引用(NULL pointer assignment,空指针赋值,即有指针未赋具体地址就使用了)等等。
1.3逻辑错误逻辑错误(Logic errors):当程序没有按照程序员的意图执行时,就表明程序中存在逻辑错误。
1.MessageBox()VC++6.0:MessageBox("Hello,World!");VS2008:MessageB ox(L"Hello,World!"); 或MessageBox(TEXT("Hello,World!"));bo box内容添加方法VC++6.0:Drop-Down List B ox Control 的Properties 中的Data 用Ctrl-Enter 输入VS2008:更名为Combo-Box Control ,并在右侧Data 区域用semicolons(即';')分隔输入3.从.net开始就没有classwizard了,全部在属性窗口里了属性窗口中有,闪电图标及右边的都是,包括事件,消息,虚函数重载,加入变量则是在类标上右击->添加变量……4.消息映射VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过a,ON_MESSAGE(message,OnMyMessage);OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPAR AM, LPARAM);如果不符合,则有错误提示:error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(void)”转换为“LRESULT (__t hiscall CWnd::* )(WPARAM,LPARAM)”b,在VS2005中,OnMyMessage返回值必须为BOOL,且含有一个UINT 参数指出了命令ID,其形式为:afx_msg BOOL OnMyMessage(UINT);如果不符合,则有错误提示.如在VS6中,OnMyMessage2的定义为afx_msg BOOL OnViewZoomBar()时亦可正常编译通过,但在VS2005下,有错误提示:error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”5.字符处理在c中广泛使用的strcpy,strcat,strstr等等推荐使用更为安全strcpy_s,strcat_s,strstr_s等来代替.6.数学函数检查VS2005中,数学函数的参数检查更为严格,如pow(2, 45)会引起一个错误提示如下:error C2668: “pow”: 对重载函数的调用不明确d:\program files\microsoft vi sual studio 8\vc\include\math.h(575): 可能是“long double pow(long double,int)”d:\program files\microsoft vi sual studio 8\vc\include\math.h(527): 或“float pow(float,int)”d:\program files\microsoft vi sual studio 8\vc\include\math.h(489): 或“double pow(double,int)”试图匹配参数列表“(int, int)”时正确的使用为pow(2.0, 45)7.更加符合C++标准如在VS6中,在FOR循环中的循环变量的定义的作用域延伸到循环体外,VS2005则修正了这样的bug。
【转】VC和VS的区别
各个版本之间的对应关系
使⽤windows平台搞开发时,下载第三⽅库时经常会遇到⽂件名以VCxx版本号命令,VC版本如何转换成对应的VS的版本呢,这⾥总结⼀下vc和vs的关系。
Microsoft Visual Studio 6.0: VC6.0
Microsoft Visual Studio .NET 2002: VC7.0
Microsoft Visual Studio .NET 2003: VC7.1
Microsoft Visual Studio 2005: VC8.0
Microsoft Visual Studio 2008: VC9.0
Microsoft Visual Studio 2010: VC10.0
Microsoft Visual Studio 2012: VC11.0
Microsoft Visual Studio 2013: VC12.0
Microsoft Visual Studio 2015: VC14.0
VS与VC的区别
VS(virtual studio)是微软开发的⼀个集成⼯具,可以开发C++、C#、HTML、VB等。
VC(virtual c++)是专门开发C++的⼯具。
当你进去VS的时候,会提⽰你选择开发环境,如果你选择C++,选择的就是VC编程平台。
VS选择C++的开发环境
【⼯具】->【导⼊导出设置】->【重置所有设置】->【不保存/保存当前设置】->【C++】->【完成】。
VC++以及VS个版本比较及C++编译器比较VC6.0一般是用c++语言的MFC,是Visual Studio6一部分。
(是VC2003,VC2005,VC2008,VC2010通称,就可可以用c++语言的.net),是Visual 2003一部分。
vs包含了vc.vb,vj,vc#,是一个大集成的开发平台。
VC++是Visual C++的简称,是Visual Studio编程套件的一个部分,支持语言C/C++的编译。
vc和vs对应版本关系:vc6.0----------visual studio6.0vc7.0----------visual studio2002vc7.1----------visual studio2003vc8.0----------visual studio2005vc9.0----------visual studio2008C++编译器:Visual C++:Windows平台上最流行的编译器,和VS集成的很好,编译效率和编译后的代码效率都不错GCC/G++:开源的,Linux/Unix平台上的首选,而且支持N中硬件平台,如果想进行跨平台编译的话,这是一个不错的选择。
编译效率和编译后的代码效率都不错。
据说Linux内核的开发者都用2.95版的,这个版本编译出来的C代码应该是效率最好的。
GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU 开发的编程语言编译器。
它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果计算机Mac OS X操作系统的标准编译器。
GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。
GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。
GCC很快地扩展,变得可处理C++。
之后也变得可处理Fortran、Pascal、Objective-C、Java,以及Ada与其他语言。
VC++6.0和VC++2010的区别VC++6.0和VC++2010有什么具体的区别呢?只要看看将6.0的程序升级运行在2010上所需要注意的“三大注意八大纪律”后,你将会一清二楚。
面对一个新的开发平台,面对一些新的开发技术,在程序员中,往往有两种截然不同的态度:保守的程序员认为:我还是保险一点比较好,让别人先升级,先试验,等到别人成功升级或者新技术应用成熟之后,我再跟着升级也不迟。
虽然说长江后浪推前浪,但是前浪都是死在沙滩上啊。
激进的程序员则认为:又有新技术出来了?太好了。
新的开发技术可以给应用程序带来这么多新的功能特性,那我赶快应用到我的产品中,增强产品的功能特性啊。
还等什么,立刻,马上进行升级应用新技术。
作为一个成熟的程序员,这两种态度都应该是我们所反对的。
面对业界不断推出的新技术新平台,我们不应该像保守的程序员那样,对新的技术发展趋势视而不见,等着别人应用成熟了再去应用,那样也许机会就白白错过了。
到时候眼巴巴看着别人吃肉自己却只有喝汤的份了。
同样的,我们也不应该像激进的程序员那样,还没有弄明白新技术到底是什么东西,新技术可以给我们带来什么价值,一听说是新技术就盲目应用到自己的产品上,而不管这些新技术是否适合自己的产品,这样的盲目应用新技术,真的只会让自己“前浪死在沙滩上”,成为盲目应用新技术的反面教材。
所以,在面对已经在业界炒得沸沸扬扬的Visual C++ 2010这个新的开发平台的时候,我们不能保守,丝毫不理会Visual C++ 2010的巨大功能改进所可能带来优势;我们也不能激进,不管三七二十一地将我们应用成熟的Visual C++ 6.0 一股脑地升级到Visual C++ 2010。
面对这个升级问题,我们应当遵守三大纪律:•先副业后主业如果我们的公司有多个产品线,那么你的升级过程应该是从你的副业开始,等副业成功升级,积累经验后,再扩展到主业。
这样不仅可以保证你的主业不受影响,降低了升级的风险。
还在使⽤vc6.0吗??vs2010吧每个⼈在⾯对新的事物的时候,总是充满了排斥感,当vista和win7来临的时候,我们还在留恋xp,说xp是如何的好,win7是如何的不给⼒,当然,我们必须承认,xp是⼀款优秀的操作系统,这个我们⽆法否认,也不能否认,但是它毕竟是01年的产品,就像⼆战的“零式”飞机⼀样,它很优秀,曾经叱咤太平洋,但是它可以和现在的f22猛禽,t50,f35闪电,歼20⽐较吗,为什么呢,因为不是同⼀个时代的东西了,现在的航电系统,发动机技术,电传技术等等,决定了零式飞机成为历史。
那么下⾯,我们就看看vc6.0如何成为了历史了,鄙⼈建议使⽤vs2010.1⼤家都知道,xp很快就要退出历史舞台了,那么我们开发的程序就更多的是针对vista和win7,或是win8,但是呢,在vc6.0上,很多技术已经过时,在新的操作系统上⾯已经使⽤了新的实现技术,⽽且更加强⼤⽅便,这⾥我要说的就是以前很多的⽅法都是基于API函数,通过参数或是⼀个结构体定义属性,然后调⽤⼀个函数达到设想的效果,例如,打开另存为对话框就是⼀个例⼦,现在使⽤的是基于COM的IFileDialog接⼝来实现这个⽅法,那么这个⽅法⽐以前的⽅法使⽤起来更加⽅便,不管是在属性的定义上,还是获取的结果上,都更加优秀,IFileDialog直接获得就是IShellItem接⼝,在以前,如果我们要获得这个接⼝,是通过将全路径传到⼀个函数中,来获得这个接⼝,⽽现在我们直接就可以⽤了。
2上⾯我们说到了com(component object model ),也就是组件对象模型,这个模型将⽅法的声明使⽤和实际执⾏分开,⽽且与语⾔⽆关,可以在别的语⾔开发平台上也可以使⽤,所以,可以做到⼀次开发,多重使⽤,对于对象的⽣命周期的管理更加科学,⽽且使⽤起来极为⽅便,我想这也是为什么现在很多的功能不再使⽤API来实现,⽽是使⽤COM来实现,如DDE(动态数据交换),现在已经被DDEML代替,剪切板也不再使⽤共享内存来实现进程之间数据的传输,⽽是使⽤的基于com的数据对象实现,⽽这⼀切对系统是有要求的,那就⾄少vista以后的系统,所以应该是vs2010,或是vs2008.微软每出⼀代系统,对应就有了相应的编译器更新,如果你明⽩代码到exe的过程,那么你就明⽩了。
从VC++6.0不足看Visual C++2010新特性说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital),程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯定会想到VisualC++6.0。
为什么是6.0而不是其它的版本?这里的原因就不用我再多讲了,因为太经典了!这个经典已经有了10年的光荣历史,微软的Visual Studio系列也已经发展到了Visual Studio 2010。
漫长的辉煌中Visual C++6.0也暴露出了一些问题,在这篇文章中我们将从Visual C++6.0的问题和Visual C++2010的新特性两个方面向大家介绍,也可以说是Visual C++2010 PK Visual C++6.0。
VC++ 6.0的问题VC++ 6.0是Visual Studio 6.0中的一种重要编程语言,也是中国C++开发人员使用最多的开发工具之一。
Visual C++是构建Windows平台下应用程序功能最强大而又最复杂的工具,是目前世界上使用最多的开发工具之一,应用极度广泛,从桌面应用程序到服务器程序,从系统软件到应用软件,图形图像,语音技术,设备驱动,网络安全,加密解密等等几乎无处不在。
主流的3 种操作系统Windows,Linux,Unix内核都是用C语言和汇编语言写的,而上层的高级特性都是用C++编写。
直到今天,Visual C++6.0仍然占据着C++开发工具的绝对优势的地位。
自从微软从2000年开始推行.NET战略以来,其核心的编程语言是C#,从那个时候,C++的支持力度就开始不断的下滑,虽然Visual C++也有几次更新,但都不是很令人满意,更灵人焦虑的是,有些开发者开始怀疑Visual C++的前途。
尽管Visual C++的一些快捷开发被其他开发语言所取代,由于C++可以与操作系统的天生的暧昧关系,能够与C语言无缝结合,所以Visual C++不可能被淘汰,尤其是对于底层开发。
从VC6到VC9、VS2010移植代码问题总结当年在学校学习C编程的时候用的是TC2.0,后来学C++用TC3.0,有一天突然发现Borland C++ 3.1的IDE比较好用,于是改用BC31,然后是BC4,但是到了BC5(还有BC5.02)的时候就玩不下去了,因为我那台只有16M内存的P100实在是跑不动这个庞然大物,在OWL和MFC之间“痛苦地”抉择了一部电影的时间后,我决定放弃添加内存的计划,改用Visual C++试试。
因为当时内存太贵了,不过电影很好看,我还记得名字是《西域雄狮》,讲的是黄飞鸿到北美开宝之林分号的故事,还收了一个洋徒。
你看这思维跳跃的,打住,说正事儿吧。
看完电影后装了一个Visual C++ 4.2,这Microsoft的东西就是争气,在我的破机器上跑得马溜的快,于是就用买内存的预算买了一本《Visual C++4.0从入门到精通》,那个时候的出版社就是效率低,这本书已经是所有关于VC的书中最新的了,好像还看到一本《Visual C++ 1.5-2.x 使用指南》,什么年代的事情了,还摆在书架上。
哪像现在的出版社,简直就是“与时俱进”的典范,Microsoft那边《Windows 7》刚发布了个预览版,这边《下一代xxx揭密》就已经上架了,唉,又扯远了,打住。
没多久VC5就出来了,好在这两个版本的用户界面变化不大(MFC的版本稳定在4.2),我就在《Visual C++ 4.0从入门到精通》这本书的指导下“精通”了VC5。
1998年的时候VisualC++ 6.0推出了,但是我一直坚持用VC5,1999年我毕业设计还是选择用VC5,不为别的,就是因为当时盗版的VC6都没有帮助文件,就是缺少MSDN,没有这个还怎么写代码?毕业设计完成之后我从朋友那里弄到了传说中的两张MSDN光盘,于是开始用VC6,从此以后,VC6就一直存在于所有我用过的电脑中,后来VC7(7.1),VC8出来以后,VC6的地位也一直没有动摇过,用C++开发软件我首选VC6,我还为VC6开发了一个文件标签栏插件Tabbar,可以通过标签栏在打开的代码文件之间快速切换,除此之外还具有很多其它功能,比如自动打包压缩项目代码。
唉,又跑题了,打住。
做人要与时俱进,这不,今年VC9也随着Visual Studio 2008发布了,再不赶上就真的老套了。
说是这么说,不过心里还是有些余悸的,2006年的时候我曾经试图将我的一个工具软件的代码升级到VC8,但是我低估了新的编译器的兼容性(当年从VC5到VC6可是没有那么多麻烦),上来就是一大堆编译错误,警告就更是牛毛,当时因为急着为工具软件开发一个新功能,没有时间解决这些问题,只好放下了,这一放就是两年。
我这个人喜欢自己做工具软件,目的是为了方便自己,以前用VC6,觉得在代码源文件之间切换很麻烦,但是WndTab太占用资源,于是就借鉴WndTab的部分代码自己做了个标签栏插件Tabbar,还把从CodeProject上看到的好的创意都添加进去,后来用Source Insight,觉得它没有文件标签栏太土,就给它做了个标签栏外挂(TabSiPlus),就这样几年下来竟然有几百兆的工具代码,这个移植的工作量可是非同小可,想着都怕怕呀!不过也没办法,这两年主要用GCC做嵌入式开发了,没有时间维护这些工具,自己在使用过程中累计下来的BUG和新需求也有一大堆,需要进行升级了,适逢这次机会将其移植到VC9到也是个不错的选择。
其实程序员自己给自己写工具很有好处,比如我喜欢边写代码边听音乐,于是我就把自己写的MP3播放器集成到VC开发环境中,这样就可以象操作VC的其它功能一样选择音乐文件,还比如。
又扯远了,回到正题,讲讲移植过程中遇到的问题。
首先可以直接用Visual Studio 2008的打开VC6的工作区文件和项目文件(dsw和dsp),并将其升级为VS2008的解决方案格式和项目格式(sln和vcproj),VC9的编译器相对于VC6有了很大的变化,一些编译参数和链接参数被废弃(比如/map:line),有一些改变了名称,还有新增的选项,不过不用担心,升级过程会自动对其进行转换,最终都会得到一个正确的解决方案和VC项目文件,这个过程不会遇到太多的麻烦,问题都出在随后的编译过程中,下面就将我在移植的过程中遇到的问题和我的解决方法总结一下,希望对还在用VC6维护代码的朋友有所帮助。
一、_WIN32_WINNT 与 _WIN32_IE 设置冲突_WIN32_WINNT 与 _WIN32_IE设置不兼容会导致如下C1189致命错误:StdAfx.cppc:/program files/microsoft sdks/windows/v6.0a/include/sdkddkver.h(217) : fatal errorC1189: #error : _WIN32_WINNT settings conflicts with _WIN32_IE settingStdAfx.cpp通常是项目中第一个编译的文件,这个错误将导致编译无法继续进行。
产生这个错误的原因是原因是_WIN32_WINNT的版本定义太老,老的VC代码对_WIN32_WINNT的典型设置是:#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif0x0400相对于VS2008所带的Plarform SDK(在文件sdkddkver.h中)中_WIN32_IE的定义来说太老了,导致不兼容,可以将其改成0x0501或更高的版本避免这个问题,如下所示:#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0501#endif也可以将这三行_WIN32_WINNT定义删除,这样就会使用Plarform SDK中的_WIN32_WINNT定义,自然就不存在不兼容问题了。
不过出于对老版本VC的兼容考虑(毕竟以后可能还要使用VC6编译代码),最好这样修改:#if _MSC_VER <= 1200 // MFC 6.0 or earlier#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif#endif二、afximpl.h文件中的语法错误MFC出现的时候STL还没有成为C++的标准,所以MFC使用一套自己的模版库,比如CArray、CList、CMap等等,这些类型声明都在afximpl.h文件中。
原来在VC6编译器适用的模版语法可能不适用VC9,特别是当以下四个环境变量设置不兼容时,就会出现这个编译错误,大致情况如下:e:/software/microsoft visual studio 9.0/vc/atlmfc/src/mfc/afximpl.h(625) : error C2059: syntax error : '<L_TYPE_raw>'e:/software/microsoft visual studio 9.0/vc/atlmfc/src/mfc/afximpl.h(625) : error C2238: unexpected token(s) preceding ';'e:/software/microsoft visual studio 9.0/vc/atlmfc/src/mfc/afximpl.h(629) : error C2059: syntax error : '<L_TYPE_raw>'e:/software/microsoft visual studio 9.0/vc/atlmfc/src/mfc/afximpl.h(629) : error C2238: unexpected token(s) preceding ';'合理调整stdafx.h中WINVER、_WIN32_WINNT、_WIN32_WINDOWS和_WIN32_IE的设置可以避免这个问题,将三个与Windows版本有关的环境变量设置为0x0501或更高版本,将IE版本的环境变量设置为0x0500以后的版本就可以解决这个问题。
当然,考虑到与旧的VC6代码兼容,可以采用上一个问题中提到的最后一个解决办法,用_MSC_VER进行隔离。
三、旧的CRT库和新的安全CRT库引起的C4996告警解决了环境变量设置不匹配导致的问题后,编译过程就真正开始了,不过首先映入眼帘的应该是成堆的C4996编译告警,对每个使用了含字符串参数的CRT库函数都会有C4996编译告警,一个典型的输出如下所示:f:/project/...../commonfunc.cpp(280) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.e:/software/microsoft visual studio 9.0/vc/include/string.h(74) : see declaration of 'strcpy'MSDN online 是这样解释的:为了显著增加CRT库的安全性,许多CRT函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。
只要一个CRT函数有新的安全版本,编译器就会产生一个C4996告警,不过,出现这个告警的目的并不是说旧版本的CRT函数将淡出CRT库,告警出现只是为了提醒程序员这个函数有更安全的版本存在。
一种安全的或者是被鼓励的做法是用安全版本的函数替换现有的CRT 函数,不过对于一个有相当代码量的项目,替换工作量也是巨大的,这可不是用名称查找、替换就能简单解决的问题,因为许多安全版本的CRT函数参数个数也发生了变化。
也可以用预处理指令消除这个告警:#pragma warning( disable : 4996 )或者定义 _CRT_SECURE_NO_WARNINGS 压制这个告警(在stdafx.h中define或在项目属性中设置预处理符号,PreProcessor Definitions)。
除了C语言的CRT函数外,POSIX 兼容函数也存在这个告警,解决方法是用POSIX标准名称替换(比如access换成_access)或者是定义_CRT_NONSTDC_NO_WARNINGS 压制这个告警(方法同上)。