gcc 5.4.0与12.2.0中__extension__内break行为差异及Qt编译问题
GCC版本间__extension__代码中break行为差异问题
背景
在树莓派5 64位的Debian GNU/Linux 12(bookworm)系统上编译Qt 4.8.7时,遇到ts文件转qm文件的问题,排查发现根源是Qt foreach仅遍历第一个元素,这是由__extension__代码块中的break行为异常导致的。
问题复现
以下是复现问题的代码:
#include <iostream> int main() { for (int i = 0; i != 5; ++i) for (int j = i;; __extension__ ({break;})) std::cout << j << std::endl; }
- 在旧版Ubuntu 16.04(gcc版本5.4.0 20160609)上运行,会依次打印0到4;
- 在树莓派5(gcc版本12.2.0 Debian 12.2.0-14)上运行仅会打印0;
- 若将代码中的
break替换为continue,树莓派5上也能正常打印0到4。
行为验证
通过以下代码可验证break实际作用于外层循环:
#include <iostream> int main() { for (int j = 1;; __extension__ ({break;})) std::cout << j << std::endl; }
编译该代码会报错:error: break statement not within loop or switch。
疑问
这种差异是__extension__的行为发生了变更,还是一个已知的bug?
内容的提问来源于stack exchange,提问作者bruno
相关产品推荐
相关产品推荐

