如何解决C++:如果缺少函数返回语句,for 循环被优化为无限循环 - 编译器错误?
以以下最小示例为例:
#include <stdio.h>
bool test(){
for (int i = 0; i < 1024; i++)
{
printf("i=%d\n",i);
}
}
int main(){
test();
return 0;
}
test
函数中的 return 语句缺失。如果我像这样运行示例:
g++ main.cpp -o main && ./main
然后循环在 1024 次迭代后中止。但是,如果我在打开优化的情况下运行示例:
g++ -O3 main.cpp -o main && ./main
然后这是优化的,我得到了一个无限循环。
此行为在 g++
版本 10.3.1
和 clang++
版本 10.0.1
中是一致的。如果我添加 return 语句或将函数的返回类型更改为 void
,则不会发生无限循环。
我很好奇:人们会认为这是编译器错误吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了对这个函数中发生的事情的所有保证?
解决方法
您的函数声明为 bool test()
,但您的定义从不返回任何内容。这意味着你已经违反了与语言的约定,并在未定义的行为领域被暂停了。在那里,所有结果都是“正确的”。
您可以将未定义行为视为:当要求编译您的代码时,未定义编译器产生的输出。
实际上,“未定义”是指编译器根据您的代码创建的程序的可观察行为,但归结为相同。
这不是编译器错误。
您要求编译器从函数返回 bool
,而不从函数返回 bool
。编译器根本无法做到这一点,这不是编译器的错。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。