【发布时间】:2017-12-06 05:13:35
【问题描述】:
我知道使用没有原型的函数是错误的。 但是当我摆弄时,我遇到了这种奇怪和冲突的行为。
测试1
#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 ,double );
错误是
variablename.c:8:5: 错误: 'xof' int xof(char c,浮动 f)
我理解这一点,因为隐式生成的函数声明(将整数值默认为 INT,小数为 DOUBLE)与以下函数定义不匹配
测试2
#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
谁能解释一下。 提前致谢。
【问题讨论】:
-
C 需要在使用前正确声明。其他任何东西都是无效的 C!因此,问“为什么这个 C 代码做某事是没有意义的——它不是 C 代码,而且你不使用符合标准的编译器或忽略警告。根据你的介绍,你很清楚。
-
旧版本的 C 标准允许函数参数推断。第二个例子可以通过这些松散的规则“偷偷摸摸”。这是 C 转为始终要求前向声明的原因之一。
-
只需更新到不超过 18 年的编译器。那你就不用考虑这些了。
-
投票重新开放。链接的 dup 询问是否需要函数原型。这个问题询问在什么情况下可以使用隐式声明。
标签: c function-declaration implicits function-definition