0

搜索此问题的答案,但找不到任何东西。我能找到的最接近的是 difftime 在明显存在差异时返回 0这有一个很好的解释,这与参数如何被推入堆栈以及格式期望什么有关,但我认为我的问题不同:

我做了一个尽可能简单的例子。假设我在 C 中有以下代码:

time_t starttime = time(NULL)
somefunction();
time_t newtime = time(NULL)

fprintf(stderr, "starttime %f and difftime %f\n", starttime, difftime(newtime, starttime));
fprintf(stderr, "difftime %f and starttime %f\n", difftime(newtime, starttime), starttime);
return 0;

而 somefunction 是一些运行 1 或 2 秒的函数。我得到的输出是:

starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000

我什至不知道从哪里开始我的问题。为什么我交换订单时,输出的值仍然相同?此外,为什么其中一个值为 0?无论我使用 %f、%d、%lu、%llu 等,这都是一样的。对此有堆栈参数解释吗?fprintf 真正在内部做什么?

谢谢你。我已经浪费了太多的时间来调试它,我真的很感激你的帮助!

4

2 回答 2

2

"%f"说明符不适用于time_t您的平台。据我所知,time_t类型可以是整数或实数。

例如,POSIX 标准只是说:

time_t并且clock_t应该是整数或实浮点类型。

尝试这个:

/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);

我已经看到了将其转换为 等的建议uintmax_tunsigned long long显然,真正的答案在这里

printf() time_t, period 没有统一的方法。你不应该这样做 - 你甚至不需要知道 time_t 在内部是什么。建议的替代方法包括 ctime() 和 strftime()。请使用这些来保持代码的可移植性。

于 2011-12-10T12:10:36.777 回答
1

starttime是 a time_t,但你要用 a 打印它%f,它需要 a double。显然,在您的平台上,time_t是某种整数类型。

很可能,您的平台对变量参数列表函数的调用约定,例如fprintf()在与整数参数不同的位置传递浮点参数。

difftime()函数可能返回 2.0,它在第一个浮点参数位置传递,这就是为什么第%f一个在两种情况下都打印 2.0。第二个浮点参数位置似乎包含一个零,因此第二%f个在两种情况下都打印一个零。time_t参数被放置在代码根本不检查的不同位置fprintf()

于 2011-12-10T12:33:15.323 回答