【问题标题】:how to use clock_gettime如何使用clock_gettime
【发布时间】:2017-08-18 19:17:37
【问题描述】:

我正在尝试使用clock_gettime 函数,但无法弄清楚所需的标题是什么(或者如果不是标题问题,我做错了什么)。 这是我的代码:

#include <stdio.h>
#include <unistd.h> /*for CLOCK_REALTIME? */
#include <time.h>

#define NANO_TO_MILLI(N) ((N)/ 1000000)


struct TimeStruct
{
    time_t sec;        
    time_t nano;  
};

typedef struct TimeStruct TimeStruct;

void getTime (char* _timeStr);

int main()
{
    char* time;
    getTime(time);
    printf("%s\n", time);
    
    return 0;
}


void getTime (char* _timeStr)
{
    time_t milli;
    TimeStruct *curTime;
    struct tm* info;
    
    clock_gettime(CLOCK_REALTIME, curTime);
    milli = NANO_TO_MILLI(curTime-> m_nano);
    
    info = localtime(&(curTime-> m_sec));
    sprintf(_timeStr, "%d-%d-%d %d:%d:%d.%d", 1900 + info->tm_year, info->tm_mon, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec,  (int)milli);
    
}

我收到以下错误:

函数clock_gettime的隐式声明

CLOCK_REALTIME 未声明

我错过了什么?

我正在使用带有 ansi 和 pedantic 标志的 gcc (linux) 进行编译

【问题讨论】:

  • 你是怎么编译的?
  • 旁白:TimeStruct *curTime; .... clock_gettime(CLOCK_REALTIME, curTime); 很可疑。我希望TimeStruct curTime; .... clock_gettime(CLOCK_REALTIME, &amp;curTime);
  • 另一个未成年人:"%d-%d-%d %d:%d:%d.%d" --> "%d-%d-%d %d:%d:%d.%03d"info-&gt;tm_mon --> info-&gt;tm_mon+1.
  • 注意clock_gettime()是一个非标准函数。

标签: c time include


【解决方案1】:

当您使用-ansi 进行编译时,一些 POSIX 标准函数将变得不可用。要访问它们,您需要使用-std=gnu99 进行编译。这为您提供了 C99 以及 POSIX 和 GNU 扩展。

除此之外,clock_gettime 需要一个指向 struct timespec 的指针,但您提供的是自定义类型。摆脱自定义类型并使用标准类型。

另外,您传递给clock_gettime 的指针未初始化。此函数期望此参数指向struct timespec 的实例。同样,该函数将写入未初始化指针所具有的任何地址。这会调用undefined behavior

与其创建一个不指向任何地方的指针,不如创建一个结构实例并传入其地址。

void getTime (char* _timeStr)
{
    time_t milli;
    struct timespec curTime;
    struct tm* info;

    clock_gettime(CLOCK_REALTIME, &curTime);
    milli = NANO_TO_MILLI(curTime.tv_usec);

    info = localtime(&curTime.tv_sec);
    sprintf(_timeStr, "%d-%d-%d %d:%d:%d.%d", 1900 + info->tm_year, info->tm_mon, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec,  (int)milli);

}

您还正在写入main 中的未初始化指针。使用足够大的char 数组来存储字符串。此外,请使用 time 以外的名称,因为它会掩盖系统函数的相同名称。

int main()
{
    char timeStr[50];
    getTime(timeStr);
    printf("%s\n", timeStr);

    return 0;
}

【讨论】:

  • 我认为clock_gettime(CLOCK_REALTIME, *curTime); 应该是clock_gettime(CLOCK_REALTIME, &amp;curTime);
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多