我一直在使用 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
导致这种情况发生。
有人可以解释为什么会这样吗?