C 语言中返回未定义值的函数
在库中出现的代码片段中,名为 Min 的函数定义如下:
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a,b,out); out.w = min(a.w,b.w); }
出乎意料的是,尽管没有返回值,但该函数编译时没有错误,因为它的返回类型未显式声明为 void。
根据 C 11 标准草案第 6.6.3 节,此行为未定义。该标准规定“从函数末尾流出相当于没有值的返回”,并且“这会导致返回值的函数中出现未定义的行为。”
在这种情况下,编译器是没有义务提供错误或警告,因为在所有情况下都可能很难准确诊断问题。
但是,使用 -Wall 标志,可以提示 GCC 和 Clang 生成警告类似于:
warning: control reaches end of non-void function [-Wreturn-type]
要将此警告转换为错误,确保更高级别的代码质量,可以使用 -Werror=return-type 标志。此外,建议使用 -Wextra -Wconversion -pedantic 标志进行全面的错误检测。
在 Visual Studio 中,上述代码将触发错误 C4716:
error C4716: 'Min' : must return a value
如果并非所有代码路径返回一个值,则会发出警告 C4715。
以上是为什么没有显式'return”语句的 C 函数编译时不会出错?的详细内容。更多信息请关注PHP中文网其他相关文章!