C 算术题:前向声明和除法后始终返回零 问题陈述

C 算术题:前向声明和除法后始终返回零 问题陈述,c,C,我试图编写一个util函数来帮助我计算两个时刻之间经过的时间,这个函数被放入一个单独的util.c文件中。 但是,每当我试图通过外部函数调用访问算术计算时,结果总是零。代码如下所示: double timing(struct timeval before, struct timeval after){ struct timeval result; timersub(&after, &before, &result); double res =

我试图编写一个util函数来帮助我计算两个时刻之间经过的时间,这个函数被放入一个单独的
util.c
文件中。
但是,每当我试图通过外部函数调用访问算术计算时,结果总是零。代码如下所示:

double timing(struct timeval before, struct timeval after){
     struct timeval result;
     timersub(&after, &before, &result);
     double res = (double) result.tv_sec + ((double)result.tv_usec)/1e6;
     return res;
}
我尝试在我的
main
函数中调用
计时

gettimeofday(&before,NULL);
usleep(some seconds);
gettimeofday(&after,NULL);
double salad_time = timing(before, after); 
printf("THE TIME used for a salad is %f \n",salad_time);
奇怪的是: 如果我只是这样做,最终的
printf
结果总是给我一个
0.000000

由于
timing
是在另一个
util.h
文件中定义的,并且其功能代码是在
util.c
中编写的,因此我只需将
util.h
包括在内,并尝试在我的
main
函数中使用它

我的研究 我发现很多帖子都在谈论类似的问题,执行除法的结果是0,原因是人们使用整数除法,结果在某种程度上是四舍五入的,结果是0。因此,我在执行算术运算时,在我的
计时
函数中添加了一些类型的
转换,如您所见。但这没有帮助

我的初步解决办法 有趣的是,我在我的
main
函数上加了一个函数
定时的向前声明,整个过程刚刚开始,计算结果正确显示!
在
主功能
上方,该版本看起来如下:

double timing(struct timeval before, struct timeval after);
int main(int argc, char ** argv){ ... }

这是怎么回事?我做错了什么?

在ANSI C中,可以调用没有原型的函数。编译器将假定返回值为“int”

更准确地说,编译器将假定原型为:

int foo();
这可以解释为什么返回值为零


无论如何,从不兼容类型的函数返回double是未定义的行为。

Show。以及“初步解决方案”。基于“正向声明”解决方案,在C语言中,函数需要在使用前声明,因此这可能是您的问题。另外,请记住在生成时启用额外警告,并将所有警告视为必须解决的错误。缺少前向声明是编译器可以(并且将会)发出警告的一件事。如果您“在我的
main
函数的顶部提出函数
计时的前向声明,那么整个过程就正常了”,我怀疑编译器使用了隐式
int
返回类型作为
计时
函数。编译器需要在遇到调用之前查看声明。如果您在一个翻译单元中定义它,而不在另一个调用它的单元中声明它,您很可能会遇到这样的问题。使用
-Wall
编译嗨,一个简单的问题:那么外部头文件中的函数声明不被视为原型?我们是否需要在使用前向前声明自定义函数,即使包含了相应的头?@aProgrammingnoob,头应该足够了。是否确实包含了正确的标题?可能是输入错误?因此标题名为
myUtil.h
,我在标题文件中添加了
header-guard
,名为
ifdef-myUtil\u h#define-myUtil\u h#endif
。函数声明保持不变。只是跟进一下,我在标题栏中发现了一个拼写错误。它应该是
ifndef
,我把它写到了
ifdef
。现在我修复了它,不再抛出
隐式声明
警告!:)