我是一名Java程序员,我学习了一些C ++,现在我正在为自己的工作学习一些C。我不了解有关函数声明/定义和相关函数调用的C行为。从K&R,我知道在C中(与C ++完全不同),我可以调用一个以前未声明的函数,并且编译器假定该类型的隐式声明:
int main()
{
function(10); // implicit function declaration ( int function() )
}
而且我知道这样的声明意味着一个函数接受一个固定但不确定数量的任何类型的参数(只要每个调用与其他调用一致)。我知道这是C&89之前的K&R C,但我想知道它的工作原理。现在,我有了这个测试代码,我无法理解:
#include <stdio.h>
function();
int main()
{
printf("hello %d",function(1,2,3));
implicit(11,12,32); // implicit function declaration ( implicit() )
}
int implicit(int b)
{
}
function(int a)
{
}
在function
声明的情况下(假定返回类型为int,没有关于参数的假设)与定义匹配(编译器发出警告),但是如果我用错误的参数调用该函数,它将进行编译!功能相同implicit
。我听不懂
您需要记住的是,关于声明和定义,编译过程几乎是顺序的。function
正如您所说,当编译器处理所有调用时,声明就是对参数没有任何假设,这意味着您可以使用任意喜欢的参数来调用函数。当编译器看到该定义时,不会回过头来发出有关该调用的错误,但是可能会发出警告。
对于implicit
函数,当编译器第一次看到它时,它将假定参数是您在推导出声明时在调用中传递的参数。同样,它将在以后看到该声明之前不知道其他任何信息,然后可能发出警告。
调用具有太多或更少参数的函数会导致未定义的行为,这就是为什么隐式声明的函数如此危险以及在声明函数时使用空的参数列表的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句