我刚刚遇到某人的C代码,我很困惑,为什么它正在编译。有两点我不明白。
首先,与实际的函数定义相比,函数原型没有参数。其次,函数定义中的参数没有类型。
#include <stdio.h>
int func();
int func(param)
{
return param;
}
int main()
{
int bla = func(10);
printf("%d", bla);
}
为什么这个工作?我已经测试了几个编译器,它工作正常。
int func();是从没有C标准的日子即K&R C(1989年之前,第一个“ANSI C”标准出版的那一年)开始的过时函数声明。
请记住,K&R C中没有原型,关键字void尚未发明。你所能做的就是告诉编译器关于函数的返回类型。K&R C中的空参数列表表示“未指定但固定”的参数数目。固定意味着您必须每次调用具有相同数量的参数的函数(而不是像每个调用的数量和类型可变的可变参数函数printf)。
许多编译器会诊断这个结构; 特别是gcc -Wstrict-prototypes会告诉你“函数声明不是原型”,因为它看起来像一个原型(特别是如果你被C ++毒害!),但不是。这是一种旧式K&R C返回类型声明。
经验法则:永远不要将一个空的参数列表声明留空,使用int func(void)具体。这将K&R返回类型声明转换成适当的C89原型。编译器很高兴,开发人员很高兴,静态跳棋很高兴。但是,那些误导C ++的人可能会畏缩,因为他们在尝试练习外语时需要输入额外的字符:-)
在C中func()意味着你可以传递任意数量的参数。如果你不需要任何参数,那么你必须声明为func(void)。您传递给函数的类型(如果未指定)默认为int。