微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++:如果缺少函数返回语句,for 循环被优化为无限循环 - 编译器错误?

如何解决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.1clang++ 版本 10.0.1 中是一致的。如果我添加 return 语句或将函数的返回类型更改为 void,则不会发生无限循环。

我很好奇:人们会认为这是编译器错误吗?或者这是可以接受的,因为缺少 return 语句是未定义的行为,因此我们失去了对这个函数中发生的事情的所有保证?

解决方法

您的函数声明为 bool test(),但您的定义从不返回任何内容。这意味着你已经违反了与语言的约定,并在未定义的行为领域被暂停了。在那里,所有结果都是“正确的”。

,

您可以将未定义行为视为:当要求编译您的代码时,未定义编译器产生的输出。

实际上,“未定义”是指编译器根据您的代码创建的程序的可观察行为,但归结为相同。

这不是编译器错误。

您要求编译器从函数返回 bool,而不从函数返回 bool。编译器根本无法做到这一点,这不是编译器的错。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。