隐式函数声明的行为
behaviour of implicit function declaration
我知道使用没有原型的函数是错误的。
但是当我摆弄时,我遇到了这种奇怪和冲突行为。
test1
#include <stdio.h>
#include <limits.h>
void main(){
char c='[=10=]';
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: 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' 具有 'undefined Garbage'
-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
)都不受默认升级规则的约束。在这种情况下,您会调用未定义的行为,因为您没有传递正确类型的正确数量的参数。如果您确实传递了 2 个正确类型的参数,则行为将得到很好的定义。
请注意,隐式函数声明是 C89 的一项功能,在 C99 及更高版本中不受支持,尽管某些编译器可能仍会在 C99 或 C11 模式下接受它们作为扩展。
我知道使用没有原型的函数是错误的。 但是当我摆弄时,我遇到了这种奇怪和冲突行为。
test1
#include <stdio.h>
#include <limits.h>
void main(){
char c='[=10=]';
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: 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' 具有 'undefined Garbage'
-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
)都不受默认升级规则的约束。在这种情况下,您会调用未定义的行为,因为您没有传递正确类型的正确数量的参数。如果您确实传递了 2 个正确类型的参数,则行为将得到很好的定义。
请注意,隐式函数声明是 C89 的一项功能,在 C99 及更高版本中不受支持,尽管某些编译器可能仍会在 C99 或 C11 模式下接受它们作为扩展。