Tm t1具有不完全类型,不能定义
tm t1 has incomplete type and cannot be defined
我必须编写一个程序,在无限循环中调用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("%dn",t1.tm_sec);
}
i++;
}
}
我得到一个错误说aggregate tm t1 has incomplete type and cannot be defined.
我不知道我做错了什么
您需要struct timeval,而不是struct tm。试试这个:
struct timeval t1;
另外,您需要t1.tv_sec
,而不是t1.tm_sec
。
你用错了。从以下两个中任选一个:
#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);
gettimeofday
接受一个指向timeval
而不是tm
的指针,给出自1970年以来的时间单位为秒(和微秒)。
如果您想要一个tm
,那么您将需要<ctime>
中的函数,例如localtime()
,来转换timeval
的seconds字段。
当我尝试在ESP32库上编译m_wifi.h
时,我遇到了同样的问题。
这是可能无法正确配置的c++编译器问题。如果time.h
包含在您的代码或库中,并且您得到此编译错误。
在我的例子中,tm
结构已经在time.h
中声明了。总而言之,我所要做的就是删除我包含的库time.h
,并保留ESP32版本ESP32Time.h
我还必须在变量声明部分更正从struct tm timeinfo
到tm timeinfo
的代码。
相关文章:
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 用户定义的转换不能在C++中使用static_cast
- 为什么不能将字符指针定义为数组?
- C++自定义删除运算符不能正常工作?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 为什么不能在C++中重新定义类中的类型名称?
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 为什么静态成员函数定义不能有关键字"static"?
- 精神:不能在其规则定义中使用x3::skip(skipper)[一些递归规则]
- 不能在类型说明符中定义联合
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么 for 循环不能定义两个作用域的变量?
- 为什么重载运算符不能定义为类的静态成员
- CUDA:为什么不能定义静态全局成员函数
- 为什么我们能够在类定义中定义[static const int],而不能定义其他静态const类型
- Tm t1具有不完全类型,不能定义
- 为什么不能定义在同一文件中前向声明的成员函数?
- 不能定义用户定义的字面值