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

时间:2011-05-04 14:37:14

标签: c function standards

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

#include <stdio.h>

char toChar(n) {
  //sizeof n is 4 on my 32 bit system
  const char *alpha = "0123456789ABCDEF";
  return alpha[n];
}

int main() {
  putchar(toChar(15)); //i.e.
  return 0;
}

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

3 个答案:

答案 0 :(得分:13)

K&amp; R风格的函数声明:

void foo(n) 
    int n; 
{

}

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

答案 1 :(得分:5)

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

你所拥有的是K&amp; R风格的定义,这是完全正确的。由于int被视为默认类型,如果您有类似foo(n) { }的内容,则表示默认情况下返回类型和n的类型均为int

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

int foo(n)
int n;
{
}

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

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

int foo(int n) {}

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

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

答案 2 :(得分:0)

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