隐式函数声明的行为
我知道使用没有原型的函数是错误的。 但是当我在摆弄时,我碰到了这个奇怪的和冲突的行为。隐式函数声明的行为
TEST1
#include <stdio.h>
#include <limits.h>
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,双);
误差是
variablename.c:8:5: error: conflicting types for 'xof' int xof(char c,float f)
我明白这一点,因为隐式生成函数声明(默认整数值为INT和小数为DOUBLE哪些)不匹配以下函数定义
TEST2
#include <stdio.h>
#include <limits.h>
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);应与函数定义
的冲突,但是这个运行良好(无差错)和输出是 与“A”表现为“INT”值和“B”具有“未定义垃圾”
-1 12260176
有人可以解释这一点。 在此先感谢。
如果在没有定义的情况下遇到函数调用,则生成的隐式定义将始终为int (*)()
,即接受未指定数量参数并返回int
的函数。考虑到函数调用中的实际参数是而不是。那是你误解的来源。
在第一程序的情况下,所产生的错误信息是:因为实际的函数定义包含一个或多个参数,其类型是受试者为默认促销规则出现
/tmp/x1.c:10: error: conflicting types for ‘xof’
/tmp/x1.c:10: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
/tmp/x1.c:6: error: previous implicit declaration of ‘xof’ was here
该错误。具体而言,任何低于int
(在这种情况下为char
)的整数类型在表达式中被提升为int
。 float
参数也是如此,它在表达式中被提升为double
。换句话说,使用隐式声明将正确类型的参数传递给此函数是不可能的。
第二个程序不会生成错误,因为参数(int
和unsigned int
)都不受默认升级规则的约束。在这种情况下,您会调用未定义的行为,因为您未传递正确类型的正确数量的参数。如果您确实传入了正确类型的两个参数,则行为将会被很好地定义。
请注意,隐式函数声明是C89特性,并且在C99及更高版本中不受支持,尽管一些编译器仍然可以在C99或C11模式下将它们接受为扩展。
C在使用前需要正确的声明。其他任何东西都是无效的C!因此,问“为什么这个C代码做了什么 - 它不是C代码,而且你不使用标准的兼容编译器或忽略警告。根据你的介绍,你很清楚。” – Olaf
旧版本的C标准允许的函数参数推理,第二个例子可以通过这些松散的规则“偷渡”,这是C移动到总是需要前向声明的原因之一 – AShelly
只需更新一个不超过18年的编译器,然后你 – Lundin