有时我会因为下面的代码而得到负值。
我不明白。有谁能解释为什么会这样。

int64_t gettimelocal()
{
    struct timeval Time;
    if(-1 == gettimeofday(&Time,NULL))
    {
        perror("gettimeofday");
    }
    // get time in micro seconds
    return ((Time.tv_sec * 1000000) + Time.tc_usec);
}

最佳答案

为了安全起见,您应该初始化Time。当getttimeofday失败时,您应该在perror之后返回。所以试试看:

int64_t gettimelocal() {
   struct timeval Time = {0,0};
   if(-1 == gettimeofday(&Time,NULL)) {
     perror("gettimeofday");
     return -1;
   }
   // get time in micro seconds
   return (((int64_t)Time.tv_sec * 1000000) + Time.tv_usec);
}

最后,你确定乘法不会溢出吗?您希望强制转换以确保乘法是以64位完成的。
实际上,我建议使用带clock_gettime(3)double浮点,如下所示:
static inline double my_clock_time (clockid_t cid) {
  struct timespec ts = { 0, 0 };
  if (clock_gettime (cid, &ts))
     return NAN;
  else
    return (double) ts.tv_sec + 1.0e-9 * ts.tv_nsec;
}

打电话给
 printf ("now %.5f\n", my_clock_time(CLOCK_REALTIME));

仔细阅读time(7)。不要期望纳秒的精确度!
编译包含所有警告和调试信息的代码(例如my_clock_time(CLOCK_REALTIME))。使用调试器(gcc -Wall -g)并可能strace(1)

关于linux - gettimeofday()有时会返回负值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25605029/

10-13 07:23