[经验总结]std::string的警告信息不能消除的解决办法
来源:互联网 发布:java内存泄漏 编辑:程序博客网 时间:2024/05/16 11:20
转自:http://hi.baidu.com/xshaonan/blog/item/dedf0b1175ebfecfa7ef3f75.html
该指令允许有选择性的修改编译器的警告消息的行为
指令格式如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表示有如下几个:
once:只显示一次(警告/错误等)消息
default:重置编译器的警告行为到默认状态
1,2,3,4:四个警告级别
disable:禁止指定的警告信息
error:将指定的警告信息作为错误报告
如果大家对上面的解释不是很理解,可以参考一下下面的例子及说明
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告
等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的
一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)
在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,
所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告
在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过
#pragma warning(disable:4146)来消除该类型的警告信息
1. 在VC6.0中定义类CXMLError的头文件中起始处有如下#include语句
#include <comdef.h>
#include <string>
class CXMLError
{
…
}
在使用Level 4编译时,报告C4100,C4511,C4512,C4663,C4245,C4018几种Warning
2. 修改为如下:
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018)
#include <comdef.h>
#include <string>
#pragma warning( pop )
这时产生了大量C4514警告。
3. 再修改为
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#include <comdef.h>
#include <string>
#pragma warning( pop )
结果依然如上,有大量C4514警告,少量4663,4245,4108。
4. 再修改如下:
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#pragma warning( push )
#include <comdef.h>
#include <string>
#pragma warning( pop )
结果只余下4663, 4245, 4108
由于不能去除4663, 4245, 4108三种警告
5. 又对包含头文件修改为在Level 3编译,如下:
#pragma warning( disable:4514)
#pragma warning( push,3 )
#include <comdef.h>
#include <string>
#pragma warning( pop)
结果无警告产生。
6. 又尝试如下修改:
#include <comdef.h>
#pragma warning( push,3 )
#include <string>
#pragma warning( pop)
结果无警告产生。
小结:
1. 在防止包含头文件引起的Warning而使用#pragma warning时,应只针对产生警告的头文件进行处理,在这个问题中是<string>,这时应该在#include <string>上面加#pragma warning(push),否则可能增加其它警告,如此处产生的大量C4514
2. 在使用#pragma warning(push)后使用#pragma warning(disable: xxxx)可能无效时,可以尝试交换两个语句的顺序,这可能是VC6.0中的#pragma warning的Bug。
3. 在VC6.0中存在一些不能diable掉的Warning,如4663, 4245, 4108等。这可能是VC6.0的Bug,如已知的C4786在VC6.0中不能disable掉,使用#pragma warning(disable : 4786)之后仍然会显示警告。
- [经验总结]std::string的警告信息不能消除的解决办法
- 警告信息不能消除的解决办法
- 消除不用参数的警告信息
- 警告:不能通过‘...’传递有非简单旧数据类型‘struct std::string’的对象
- 消除vc2005的sprintf警告
- iOS 消除对应的警告!
- 消除performSelector:警告的方法
- iOS消除对应的警告!
- Autosynthesized property 警告的消除
- std::string 不能跨dll的一种解决方法
- 安卓学习杂记——关于should use @string resource警告的消除
- warning C4996: '_snprintf' was declared deprecated 警告信息的消除方法
- 警告信息 Nested weights are bad for performance 的消除方法
- tomcat出现警告信息WARN DTDEntityResolver:73的解决办法
- std::string的用法
- 全局的std::string
- std::string的用法
- std::string的用法 .
- 字符计数
- MP3文件格式解析
- 字符串匹配
- Ubuntu vnc4server安装配置
- 编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数。
- [经验总结]std::string的警告信息不能消除的解决办法
- 有重复字母的全排列的java程序
- LESSON 9 E-MAIL SECURITY part VIII
- 理解java多态的概念和作用
- poj 1251 Jungle Roads
- 全排序算法
- 关于头文件和源文件的分别
- Oracle Job 语法和时间间隔的设定
- Android SDK Manager:failed to install