unix tm t1的类型不完整,无法定义

r55awzrz  于 2023-06-22  发布在  Unix
关注(0)|答案(4)|浏览(205)

我必须写一个在无限循环中调用sleep(60)的程序。每循环五次,我必须获取当前时间并打印tm_sec字段。
这是我写的:

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main()
{
    struct tm t1;
    int i=0;
    for(;;)
    {
        sleep(60);
        if(i%5==0)
            {
                gettimeofday(&t1,NULL);
                printf("%d\n",t1.tm_sec);
            }
        i++;
    }
}

我得到一个错误,说aggregate tm t1 has incomplete type and cannot be defined.
我不知道我做错了什么。

ckocjqey

ckocjqey1#

你需要struct timeval,而不是struct tm。试试这个:

struct timeval t1;

另外,您需要t1.tv_sec,而不是t1.tm_sec

cs7cruho

cs7cruho2#

你用错了。选择以下两个选项之一:

#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *tz);

或者:

#include <time.h>

 char *asctime(const struct tm *tm);
 struct tm *gmtime(const time_t *timep);
 struct tm *localtime(const time_t *timep);
chy5wohz

chy5wohz3#

gettimeofday接受指向timeval的指针,而不是tm,给出自1970年以来的秒(和微秒)时间。
如果你想要一个tm,那么你将需要来自<ctime>的函数,比如localtime(),来转换timeval的秒字段。

t2a7ltrp

t2a7ltrp4#

我在尝试在ESP32库上编译m_wifi.h时遇到了同样的问题。
这是C++编译器的问题,可能配置不正确。如果time.h包含在你的代码或库中,你会得到这个编译错误。
在我的例子中,tm结构已经在time.h中声明了。总之,我所要做的就是删除我包含的库time.h,并保留ESP32版本ESP32Time.h
我还必须在变量声明部分将代码从struct tm timeinfo更正为tm timeinfo

相关问题