G++ ICU音译词不';t在没有-O2标志和g+的情况下工作+;
我一直在使用ICU的基于规则的音译器时遇到问题,这是由于在使用g++4.7.1的调试版本中缺少G++ ICU音译词不';t在没有-O2标志和g+的情况下工作+;,g++,icu,G++,Icu,我一直在使用ICU的基于规则的音译器时遇到问题,这是由于在使用g++4.7.1的调试版本中缺少-O2标志造成的。当我做一个发布版本(它有-O2)时,它工作得很好,但是当我在没有调试标志的情况下构建项目时,音译器对象将永远无法正确创建 Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status); 在未进行优化的情况下,t被分配一个空指针,status被设置为3
-O2
标志造成的。当我做一个发布版本(它有-O2
)时,它工作得很好,但是当我在没有调试标志的情况下构建项目时,音译器
对象将永远无法正确创建
Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status);
在未进行优化的情况下,t
被分配一个空指针,status
被设置为32767,当通过ICU的u errorName()
运行时,这将转换为伪UErrorCode
我尝试的第一件事是从我的构建中删除-g
调试标志,但这对createFromRules()
返回的内容没有影响。只有当我添加了-O2
时,它才创建了音译器
对象
测试表明-O1
、-O2
和-O3
均按预期工作,只有-O0
导致这种情况发生
有人能解释一下为什么会出现这种情况吗?在调试/不调试的情况下,不应该有不同的结果。你能创建一个包含规则的小测试用例,给出ICU版本和操作系统/平台,并提交一张罚单吗?4.7.1于2个月前发布。可能是编译器错误(ICU有很长的查找这些错误的历史!!)或潜在错误。您可以将错误与此问题联系起来,反之亦然。这似乎是使用调试器的最佳情况。@n.m.嗯,我想我可以用调试符号重建ICU…@n.m.通常是另一种方式-调试模式“解决”它@SigueSigueBen所有的规则都会这样,还是只有一套规则会这样?@Stevenrroomis我只试过一套规则。但是,在函数调用之前,我检查了UnicodeString以确保其内容正确。我应该补充一点,
parseError
的行号和列号设置超出了我的规则集的范围,但都是非负的。@SigueSigueBen您能在这里包括规则集吗?否则很难分析。或者,可以尝试一个简单的规则,比如a>B
@StevenrLoom甚至是一条像v>w这样的琐碎规则
与-O0
一起失败,但与-O2
@SigueSigueBen一起工作。如果我不清楚,我很抱歉。您仍然没有提供足够的信息:您没有指出您所在的平台、处理器体系结构以及ICU的版本。在我的第一个回答中,我是在问这些问题。在任何情况下,我建议在提交bug报告-这不是提交bug的合适论坛。