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