c – 为什么’控制到达无效功能的结束’只是警告?这合法吗?

参见英文答案 > Why does this C++ snippet compile (non-void function does not return a value)                                     7个
定义具有非void返回类型的函数是否合法C,该函数允许控制到达函数的末尾而不是到达return语句?

gcc和clang只发出警告.代码是合法的还是这些编译器只是慷慨?

GCC:

warning: no return statement in function returning non-void
[-Wreturn-type]

铛:

warning: control reaches end of non-void function [-Wreturn-type]

如果这是合法的,是否有定义的行为将返回什么值?

正如Bathsheba已经说过的那样,流出一个非空函数的结尾确实是未定义的行为.这是一个警告而不是错误的原因是你可以证明这种情况永远不会发生.例如,考虑一下:

// My magic function.
// It is forbidden to call it with values between -5 and 5
bool fun (int i) {
    if (i >= 5)
        return true;
    if (i <= -5)
        return false;
}

现在,只要函数的用户仔细阅读注释,您就有了明确定义的行为.这显然是一件危险的事情,所以编译器警告你不要这样做.

编辑:
正如MSalters所提到的,这对私有成员函数来说不那么危险,因为类不变量可以保证函数永远不会被错误地使用.考虑这个例子:

// Every member function of SomeClass makes sure 
// that i_ is in the legal range when it's done
class SomeClass {
    public:
        SomeClass () : i_{27} {}
    // Possibly more public or private functions that all make sure i_ stays valid
    private:
        bool foo () {if (i_ > 3) return true;}
        int i_;
};

现在你(作为类维护者)可以确保i_始终至少为4并且foo将始终正常工作.就个人而言,我仍然会避免这种情况,因为它会损害可维护性和可读性,但它比免费版更好,因为现在“只有”所有类维护者需要担心这个不变/可能会出错.

相关文章
相关标签/搜索