vs2012解决scanf,printf编译出错的问题

转自http://www.th7.cn/Program/c/201303/127343.shtml

在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误:


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.

原因是Visual C++ 2012 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:

《CRT函数的安全增强的版本》

下面给出这个问题的解决方案:

方法一:将原来的旧函数替换成新的 Security CRT functions。

方法二:用以下方法屏蔽这个警告:

1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:

#define _CRT_SECURE_NO_DEPRECATE

2. 或声明 #param warning(disable:4996)

3. 更改预处理定义:

项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:

_CRT_SECURE_NO_DEPRECATE

方法三:方法二没有使用更加安全的 CRT 函数,显然不是一个值得推荐的好方法,但我们又不想一个一个地改函数名,这里还有一个更简便的方法:

在预编译头文件 stdafx.h 里(同样要在没有include任何头文件之前)定义下面的宏:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

在链接的时候便会自动将旧函数替换成 Security CRT functions 。

注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二(-_-)。即实际应在预编译头文件 stdafx.h 里加入下面两句:

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1



错误原因解释:

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。

参考资料:《安全模板重载》

时间: 2024-12-20 16:26:41

vs2012解决scanf,printf编译出错的问题的相关文章

Cocos2d-x 3.0 编译出错 解决 error: expected ';' at end of member declaration

近期把项目移植到cocos2d-x 3.0,在整Android编译环境的时候,出现一大堆的编译出错,都是类似"error: expected ';' at end of member declaration"之类的,看了一些编译错误,都是cocos2d-x库里面的代码出错. 经过分析,怀疑可能是编译环境的问题,由于cocos2d-x使用了非常多C++11的新特性,这有可能导致老的编译器出错,看了一下NDK以下的文件以及toolchains里面的内容,windows编译器默认使用4.6,

安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决!

安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决! 刚从eclipse转到Android studio,安装完成之后搭建了系统默认的hello world代码工程,却出现了以下错误: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit va

boost 1.57在VC2012里编译出错以及解决

最新发布的boost版本是在2014年11月3日发布,由于项目里使用,就立即更新为最新版本的库,这样也可以让可能出现的BUG减到最少.不过在更新这库之后,发现原来可以编译通过的项目,而现在不能通过了,提示错误如下: transform_width.hpp(156): error C2589: '(' : illegal token on right side of '::' 通过仔细地查看transform_width.hpp文件,发现是其中的std::min使用有问题,因为min函数的两个传入

Perl编译出错解决方法

Perl编译出错: 解决:yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan perl-devel -y 原文地址:http://blog.51cto.com/461205160/2073194

WINCE6.0新建工程编译出错的问题

作者:LoongEmbedded(kandi) 时间:2011.8.13 类别:WINCE系统开发 ********************************LoongEmbedded******************************** 基于WINCE6.0系统,根据PDA模板新建了工程之后,现把遇到的问题和解决的方法记录一下 1.     编译系统找不到atls.lib 这里要特别注意的是,发生类似这样的错误的时候,如果从\WINCE600\build.err文件来找错误的原

Cocos2d-x iOS Mac环境编译出错 can't locate file for: -lpng -ljpeg -ltiff -lwebp -lfreetype -lwebsockets -lcurl

在Mac上用Xcode6编译错误,在windows下面Visual Studio 编译没问题,然后查看报错信息: error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: can't locate file for file: -lpng is not an object file (not allowed in a library) 1 error

gcc编译出错---make[5]: *** [s-attrtab] Killed

内存不足导致的编译出错,解决方法是增加swapfile. [email protected]:home# swapon -s Filename    Type            Size    Used    Priority 创建swapfile大小512M: [email protected]:home# dd if=/dev/zero of=/swapfile bs=1024 count=512k 524288+0 records in 524288+0 records out 536

CCS4.2编译出错提示与修改方法

可能需要的其他步骤 有时在迁移过程中向导并不会冒险去改动一些具体的内容,这时可能就需要您多加留意并解决这类问题.在大多数情况下,需要执行的更改位于内部的源文件或链接器命令文件中:由于向导在迁移过程中采用了保守的做法,因此不会直接修改这些类型的文件. ? 1. 例如,将会显示如下的消息框,<migration.log> 文件位于项目目录下.强烈建议打开此日志文件检查是否存在任何问题. 图 6:迁移警告 ? 2. CCSv3.3 中有些项目拥有自动导入的隐式包含目录,会引发生成错误.如果遇到这种情

The method getTextContent()is undefined for...编译出错

在build项目中出现了The method getTextContent() is undefined for the type Element 的错误, 原因是 本来调用的那个方法应该是jdk下的那个包里的类,而在web项目里却调用了J2EE里的xml-apis.jar下的org.w3c.dom.(实际上要 调用的那个方法是在jdk下的rt.jar下的org.w3c.dom). 解决方法 尝试了很多次.后来把jdk和J2EE在项目里的位置调整了下就好 了,即让jdk在J2EE上面. buil