我刚刚遇到了一些人的C代码,我很困惑为什么它要编译。有两点我不明白。
与实际函数定义相比,函数原型没有参数。 函数定义中的形参没有类型。
#include <stdio.h>
int func();
int func(param)
{
return param;
}
int main()
{
int bla = func(10);
printf("%d", bla);
}
为什么会这样? 我已经在几个编译器中测试了它,它工作得很好。
我刚刚遇到了一些人的C代码,我很困惑为什么它要编译。有两点我不明白。
与实际函数定义相比,函数原型没有参数。 函数定义中的形参没有类型。
#include <stdio.h>
int func();
int func(param)
{
return param;
}
int main()
{
int bla = func(10);
printf("%d", bla);
}
为什么会这样? 我已经在几个编译器中测试了它,它工作得很好。
当前回答
在旧式的声明器中,
标识符列表必须不存在 声明器用于函数定义的头部 (Par.A.10.1)。参数类型信息不为 由声明提供。例如,声明
int f(), *fpi(), (*pfi)();
声明一个函数f返回一个整数,一个函数fpi返回一个整数指针,>和一个指针pfi返回一个整数函数。其中没有指定>的参数类型;它们是老式的。
在new-style声明中
Int strcpy(char *dest, const char *source), rand(void);
Strcpy是 函数返回int,有两个参数,第一个是字符 指针,第二个指针指向常量字符
来源:- K&R书
我希望这消除了你的疑虑。
其他回答
空参数列表表示“任何参数”,因此定义没有错。 缺失的类型被假定为int型。
我认为任何通过这一点的构建都缺乏配置的警告/错误级别,尽管如此,允许实际代码没有任何意义。
如果函数声明没有形参,即为空,则它将接受不指定数量的参数。如果你想让它不带参数,那么将其更改为:
int func(void);
它是K&R风格的函数声明和定义。来自C99标准(ISO/IEC 9899:TC3)
函数声明器(包括原型)
标识符列表只声明函数参数的标识符。一个空 作为该函数定义的一部分的函数声明器中的列表指定 函数没有参数。类的一部分,函数声明器中的空列表 类的数量或类型的信息 提供参数。(如果两个函数类型都是“旧样式”,则不比较参数类型。)
函数声明器
使用带有空括号的函数声明符(而不是prototype-format参数) 类型声明器)是一个过时的特性。
函数定义
使用带有单独参数标识符和声明列表的函数定义 (而不是prototype-format参数类型和标识符声明器)是一个过时的特性。
旧的风格是指K&R风格吗
例子:
声明:int old_style();
定义:
int old_style(a, b)
int a;
int b;
{
/* something to do */
}
如果函数返回类型和形参列表上没有给出类型,则C语言假定为int。只有遵循这条规则,才有可能发生奇怪的事情。
函数定义是这样的。
int func(int param) { /* body */}
如果它是一个原型,你写
int func(int param);
在原型中,你只能指定参数的类型。参数名称为非必选项。所以
int func(int);
同样,如果你没有指定参数类型,但名称int被假设为类型。
int func(param);
如果你走得更远,跟着也行。
func();
当你编写func()时,编译器假设int func()。但是不要把func()放在函数体中。这是一个函数调用
在C语言中,func()意味着你可以传递任意数量的参数。如果你不想要参数,那么你必须声明为func(void)。传递给函数的类型,如果没有指定,默认为int。