如何处理BoostSpirit生成的警告
How do I deal with warnings generated by Boost.Spirit?
我最近安装了boost,并且正在试用Spirit库。我编译了一个简单的例子,它解析了一个逗号分隔的数字列表,并将它们相加。程序已编译,但我的编译器(VS 2013)发出了数量惊人的警告。看看来源:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;
using qi::double_;
using qi::_1;
using ascii::space;
using phoenix::ref;
template <typename Iterator>
bool adder(Iterator first, Iterator last, double& n)
{
bool r = qi::phrase_parse(first, last,
// Begin grammar
(
double_[ref(n) = _1] >> *(',' >> double_[ref(n) += _1])
)
,
// End grammar
space);
if (first != last) // fail if we did not get a full match
return false;
return r;
}
int main()
{
std::string str;
std::getline(std::cin, str);
double result;
if (!adder(str.begin(), str.end(), result))
{
std::cout << "Invalid syntax." << std::endl;
}
std::cout << "The result is " << result << std::endl;
return 0;
}
这产生了309行警告!它们看起来都像这样:
c:boostboost/spirit/home/support/terminal.hpp(264) : warning C4348: 'boost::spirit::terminal<boost::spirit::tag::lit>::result_helper' : redefinition of default parameter : parameter 3
c:boostboost/spirit/home/support/terminal.hpp(270) : see declaration of 'boost::spirit::terminal<boost::spirit::tag::lit>::result_helper'
c:boostboost/spirit/home/support/common_terminals.hpp(142) : see reference to class template instantiation 'boost::spirit::terminal<boost::spirit::tag::lit>' being compiled
这个程序编译得很好,做了我认为它会做的事情,但我想知道如何在不沉默有用警告的情况下管理所有这些警告。有没有一种方法可以禁用源自boost的警告,但保留我的代码生成的警告?Spirit是一个相当流行的库,所以我知道有一些方法可以处理它
使用VC++,您需要将Boost包含封装在几个杂注中:
#pragma warning(push)
#pragma warning(disable : 4348)
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#pragma warning(pop)
#include <iostream>
#include <string>
// ...
根据需要添加到disable
列表中,以空格分隔(文档)。
其他编译器通常允许您将指定的include路径标记为"系统"路径,并且系统路径中来自标头的所有警告都将被抑制。特别是对于GCC和Clang,请使用-isystem
而不是-I
(文档)。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- 如何处理BoostSpirit生成的警告
- BoostSpirit.Qi:如何报告解析器警告