【发布时间】:2015-07-08 12:58:09
【问题描述】:
我想在工作项目中使用一些语法。一个最小的可执行示例是:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#pragma GCC diagnostic ignored "-Wunused-variable"
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#pragma GCC diagnostic pop // pops
#include <iostream>
int main()
{
typedef unsigned long long ull;
std::string curline = "1;2;;3,4;5";
std::cout << "parsing: " << curline << "\n";
namespace qi = boost::spirit::qi;
auto ids = -qi::ulong_long % ','; // '-' allows for empty vecs.
auto match_type_res = ids % ';' ;
std::vector<std::vector<ull> > r;
qi::parse(curline.begin(), curline.end(), match_type_res, r);
std::cout << "got: ";
for (auto v: r){
for (auto i : v)
std::cout << i << ",";
std::cout << ";";
}
std::cout <<"\n";
}
在我的个人机器上,这会产生正确的输出: 解析:1;2;;3,4;5 得到:1,;2,;;3,4,;5,;
但在工作中它会产生: 解析:1;2;;3,4;5 得到:1,;2,;;3,
换句话说,一旦长整数向量中的元素超过一个,它就无法解析它。
现在,我发现工作系统使用的是 boost 1.56,而我的私人电脑使用的是 1.57。这是原因吗?
知道我们在堆栈溢出方面有一些真正的精神专家,我希望有人可能知道这个问题来自哪里,或者至少可以减少我需要检查的事情的数量。
如果是 boost 版本的问题,我可能可以说服公司升级,但无论如何都欢迎解决方法。
【问题讨论】:
-
For reference, here's the list of changes from 1.56.0 to 1.57.0。我没有看到 Spirit 有任何变化,所以我不知道该建议什么。
-
这些版本之间的库中没有相关更改。
-
@Cornstalks,很好发现。我没有意识到这是我的问题。
-
致 OP:如果您有兴趣,我是这样处理这个问题的:from 38:00 onwards 当时我正在现场编码。您会注意到我很快意识到不一致的输出带有未定义行为的味道。下一次,您可以在搜索词中使用它——尽管找出 UB 的确切来源特别棘手。另请注意,@Cornstalks,虽然我很快发现了问题,但我花了大约 20 分钟将其作为高质量的答案。
标签: c++ parsing boost auto boost-spirit