我一直遇到ICU基于规则的Transliterator的问题,结果是使用g ++ 4.7.1在调试版本上缺少-O2
标志。当我执行发布版本(具有-O2
)时,它工作正常,但是当我构建没有该标志进行调试的项目时,Transliterator
对象将永远无法正确创建。
Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status);
如果没有优化,t
会被指定一个空指针,而status
会被设置为32767,当通过ICU的BOGUS UErrorCode
运行时会转换为u_errorName()
。
我尝试的第一件事是从我的构建中删除-g
调试标志,但这与createFromRules()
返回的内容没有区别。只有当我添加-O2
时才会创建Transliterator
对象。
测试表明-O1
,-O2
和-O3
都按预期工作,只有-O0
会导致这种情况发生。
有人可以解释为什么会出现这种情况吗?
答案 0 :(得分:2)
使用/不使用调试时,不应该有不同的结果。你能创建一个包含规则的小测试用例,给出ICU版本和OS /平台,并提交票证吗? 4.7.1于2个月前发布。可能是一个编译器错误(ICU有长找到这些的历史记录!!)或潜在的错误。您可以将错误链接到此问题,反之亦然。