隐式函数声明的行为
我知道使用没有原型的函数是错误的。 但当我摆弄时,我遇到了这种奇怪而矛盾的行为。
TEST1
#include #include void main(){ char c='\0'; float f=0.0; xof(c,f);/* at this point implicit function declaration is generated as int xof(int ,double ); */ } int xof(char c,float f) { printf("%d %f\n", c,f); }
隐式函数声明将是int xof(int,double);
错误是
variablename.c:8:5:错误:’xof’int xof(char c,float f)的冲突类型
我理解这一点,因为隐式生成的函数声明 (将整数值默认为INT,小数默认为DOUBLE)与以下函数定义不匹配
TEST2
#include #include void main(){ unsigned int a =UINT_MAX; int b=0; xof(a); /* implicit function declaration should be int xof(int); */ } int xof(unsigned a,int b) { printf("%d %d\n", a,b); }
隐式函数声明将是int xof(int); 这应该与function定义冲突
但运行正常(没有错误) ,输出为‘a’表现为’int’值, ‘b’表示 ‘undefined Garbage’
-1 12260176
有人可以解释一下吗。 提前致谢。
当遇到没有定义的函数调用时,生成的隐式定义将始终为int (*)()
,即接受未指定数量的参数并返回int
的函数。 函数调用中的实际参数不予考虑。 这就是你的误解来自的地方。
在第一个程序的情况下,生成的错误消息是:
/tmp/x1.c:10:错误:’xof’的冲突类型
/tmp/x1.c:10:注意:具有默认促销的参数类型不能与空参数名称列表声明匹配
/tmp/x1.c:6:错误:先前隐含的’xof’声明就在这里
出现错误是因为实际函数定义包含一个或多个参数,其类型受默认促销规则的约束。 具体来说,任何排名低于int
整数类型(在本例中为char
)都会在表达式中提升为int
。 float
参数也是如此,它在表达式中被提升为double
。 换句话说,使用隐式声明不可能将正确类型的参数传递给此函数。
第二个程序不会生成错误,因为参数( int
和unsigned int
)都不受默认促销规则的约束。 在这种情况下,您调用未定义的行为,因为您没有传递正确类型的正确数量的参数。 如果您确实传递了2个正确类型的参数,那么行为将被很好地定义。
请注意,隐式函数声明是C89function,在C99及更高版本中不受支持,尽管某些编译器仍然可以在C99或C11模式下接受它们作为扩展。