解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)
2015-03-31 18:59
696 查看
转自:http://blog.csdn.net/angle635/article/details/22035427
前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大功能,和跟以前VS2010的差别,导致无法编译通过。
现在就来说说为什么没有编译通过,在VS2012创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2012中就是error了。
查看MSDN中对SDL的描述,SDL检查会视以下告警为错误:
也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。
从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过,还是大家根据自己的习惯自行考虑是否使用这个东西吧。
另:还有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C++->SDL检查,选测是或者否
前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大功能,和跟以前VS2010的差别,导致无法编译通过。
现在就来说说为什么没有编译通过,在VS2012创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2012中就是error了。
查看MSDN中对SDL的描述,SDL检查会视以下告警为错误:
/sdl 启用警告 | 等效的命令行开关 | 描述 |
---|---|---|
C4146 | /we4146 | 一元负运算符应用于无符号类型,从而导致无符号结果。 |
C4308 | /we4308 | 一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。 |
C4532 | /we4532 | __finally /finally中的关键词,使用continue, break 或 goto在异常终止块未定义行为。 |
C4533 | /we4533 | 初始化变量的代码不会执行。 |
C4700 | /we4700 | 使用未初始化的局部变量。 |
C4703 | /we4703 | 对一个潜在的未初始化的局部指针变量的使用。 |
C4789 | /we4789 | 当使用时,请缓冲区溢出特定 C 运行时 (CRT) 函数。 |
C4995 | /we4995 | 使用函数的标deprecated。 |
C4996 | /we4996 | 使用函数的标记作为deprecated。 |
从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过,还是大家根据自己的习惯自行考虑是否使用这个东西吧。
另:还有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C++->SDL检查,选测是或者否
相关文章推荐
- 测试vs2013对c99的支持情况和解决“将此类型用作表达式非法”的问题
- 解决VS2013使用MySQL无法创建ADO.NET实体数据类型的问题
- VS2013中无法从XXX转换为“LPCWSTR”问题的解决
- ASP.NET遇到问题,“对象不能从 DBNull 转换为其他类型”,记录一下~问题已经解决,谢谢大家~
- 使用反射解决实体类型转换问题 by hyw
- DriverStudio不能转换Source中GDI_DRIVER类型问题解决
- 解决struts2基础数据类型自动转换,输入字母报错问题!
- Oracle自定义函数解决数据类型转换出错的问题
- (转)在VS2005/2008中字符串编码问题的解决及字符串和数值类型常用的转换方法
- 解决速达软件提示将numeric转换为数据类型numeric时发生算术溢出错误问题
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- MYSQL复制源文件 丢失问题解决, innoDB 类型转换为 MyISAM
- 从EXCEL导入文件时无法将DBNull.Value强制转换为类型。。。,请使用可空类型 问题的解决
- VS2008环境中LPCWSTR类型转换问题解决方法
- 解决了64位 window 8英文版 office 2013 word繁简转换的问题( 看图)
- 类型转换中的符号扩展问题
- 解决 C++ Bulider 变量类型转换问题
- 参数中有const时进行数据类型的转换问题-固定变量转常量
- 关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
- MYSQL复制源文件 丢失问题解决, innoDB 类型转换为 MyISAM