【发布时间】:2014-10-16 17:33:14
【问题描述】:
我正在学习使用 boost::spirit 库。我拿了这个例子http://www.boost.org/doc/libs/1_56_0/libs/spirit/example/qi/num_list1.cpp 并在我的电脑上编译了它——它工作正常。
但是,如果我稍微修改一下 - 如果我初始化解析器本身
auto parser = qi::double_ >> *(',' >> qi::double_);
某处作为全局变量并将其传递给phrase_parse,一切都变得疯狂。这是完整的修改代码(仅修改了1行,添加了1行)-http://pastebin.com/5rWS3pMt
如果我运行原始代码并将“3.14, 3.15”传递给标准输入,它表示解析成功,但使用我的修改版本失败。我尝试了很多相同类型的修改 - 将解析器分配给全局变量 - 在某些编译器的某些变体中它会出现段错误。
我不明白为什么会这样,怎么会这样。 这是另一个更简单的版本,它打印 true 然后在 clang++ 上打印段错误,在 g++ 上打印段错误
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
const auto doubles_parser_global = qi::double_ >> *(',' >> qi::double_);
int main() {
const auto doubles_parser_local = qi::double_ >> *(',' >> qi::double_);
const std::string nums {"3.14, 3.15, 3.1415926"};
std::cout << std::boolalpha;
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_local, ascii::space
)
<< std::endl; // works fine
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_global, ascii::space
) // this segfaults
<< std::endl;
}
【问题讨论】:
标签: c++ boost auto boost-spirit