没有定义类型的函数参数默认为int? 我疯了吗?

由于一些奇怪的原因,我正在复制另一种不使用类型的语言的例子,并且忘了在函数定义参数中添加一个,并且它有效。

#include  char toChar(n) { //sizeof n is 4 on my 32 bit system const char *alpha = "0123456789ABCDEF"; return alpha[n]; } int main() { putchar(toChar(15)); //ie return 0; } 

我确信某些标准的大多数编译器的main默认为int(但只返回),对于其他函数,这也是一种行为,或者这个实现是否定义了? 这似乎与众不同,我的编译器只是一个稍微过时的GCC端口(MinGW)。

K&R风格的function声明:

 void foo(n) int n; { } 

如果未指定type,则默认为int。 这在C89中有效,而不是C99

@ Erik的答案是正确的,但(IMO)可能会被误解。

你所拥有的是K&R风格的定义,这是完全正确的。 由于int被认为是默认类型,如果你有类似: foo(n) { } ,它表示返回类型和n的类型默认都是int

C99(主要)删除了“default int”规则,但并未完全删除K&R样式定义。 这意味着不再允许上面的定义; 要使用与上面相同的类型定义foo ,您仍然可以使用:

 int foo(n) int n; { } 

即,仍然允许K&R样式定义,但您必须指定返回类型和参数类型,即使类型为int。

然而,这种function定义是过时的(根据§6.11.7)。 它实际上只是为了古代(预标准)代码而被允许。 您不希望以这种方式编写新代码,即使它在技术上仍然允许。 对于新代码,您显然希望使用原型样式定义:

 int foo(int n) {} 

对于那些关心此类事物的人来说,K&R风格定义仍然在一些新代码中使用。 它的terser风格在代码高尔夫中很有用(使用松散的术语)。

只要我们这样做:@stijn的回答也是正确的。 特别是当以这种方式定义函数(即,K&R样式)时,所有参数都受默认促销的约束。 这意味着如果你传递一个小于int的整数类型,它将在传递之前被提升为int ,如果你传递一个float ,它将被提升为double

afaik这称为参数推广。 我不记得确切的规则,但它归结为允许编译器使用int作为参数,而他(她?)还不知道函数原型。