如何使用clock_gettime

时间:2017-08-18 19:17:37

标签: c time include

我正在尝试使用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)进行编译

1 个答案:

答案 0 :(得分:1)

使用-ansi进行编译时,几个POSIX标准函数将无法使用。要访问它们,您需要使用-std=gnu99进行编译。这为您提供了C99以及POSIX和GNU扩展。

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

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

创建一个struct实例并传入其地址,而不是创建一个无处指向的指针。

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;
}