【发布时间】:2015-09-28 07:05:48
【问题描述】:
我惊讶地发现这是一个有效的 C 函数声明:
f() {
return 10;
}
未指定函数的返回类型。它不仅编译,而且实际上返回 10。
void main() {
int i = f();
printf("i = %d\n", i);
}
此代码产生以下输出:
i = 10
这是用 gcc 4.8.4 编译的。 为什么没有明确指定返回类型的函数声明编译时没有错误/警告?
编辑:正如here 解释的那样,返回类型不是函数签名的一部分,您不能基于不同的返回类型重载函数,但这并不能回答问题是需要返回类型用于函数声明。
【问题讨论】:
-
C 用于允许隐式 int 返回类型
-
因为支持 implicit int 以防止破坏旧代码,即使 C99 放弃了它。
-
请将
void main()更改为int main()。您不返回值,但main()是编译器将为您提供return 0的唯一函数。 -
在准标准 C 和 C89/90 中有效。在旧标准 (C99) 或当前标准 (C11) 中无效。出于向后兼容性的原因,编译器继续支持它,但GCC 5.1.0 已将默认编译模式 C11 与 GNU 扩展 (
-std=gnu11) 替换为 C90,因此f等定义默认情况下至少会生成警告. -
有关
main()函数的讨论(扩展),请参阅What shouldmain()return in C and C++。