我一直在使用 ICU 的基于规则的 Transliterator 遇到问题,结果证明这是由-O2使用 g++ 4.7.1 的调试版本中缺少标志引起的。当我进行发布构建(具有-O2)时它工作正常,但是当我构建我的项目时没有该标志进行调试时,该Transliterator对象将永远无法正确创建。
Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status);
未经优化,t分配一个空指针并status设置为 32767,BOGUS UErrorCode当通过 ICU 运行时转换为u_errorName().
我尝试的第一件事是-g从我的构建中删除调试标志,但这对createFromRules()返回的内容没有影响。只有当我添加-O2时它才创建Transliterator对象。
测试表明-O1,-O2并且-O3所有工作都按预期工作,并且只会-O0导致这种情况发生。
有人可以解释为什么会这样吗?