我有这个简单的代码(项目的一部分):
void displayFileProperties(struct stat* file,char* outputProperties , char * path)
{
struct tm* time;
// code
// code
time = localtime(&file->st_mtim);
// code
}
日食不断给我一个警告:
passing argument 1 of ‘localtime’ from incompatible pointer type [enabled by default] main.c /ex4 line 340 C/C++ Problem
知道如何解决这个问题吗?谢谢
st_mtim
是一个struct timespec(秒和纳秒)。你想要st_mtime
。
你会想要使用它:
time = localtime(&file->st_mtime);
注意最后添加的'e'。 st_mtim是一个timespec,添加'e'是time_t(你需要的)。
完全改变了答案:
几点建议:
1)确保#include这些标题:
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
2)将指针转换为“const”
time = localtime((const time_t *)&file->st_mtime);
3)回发会发生什么
=====================================================
其他建议:
1)请阅读以下两个链接:
从内核2.5.48开始,stat结构支持三个文件时间戳字段的纳秒分辨率。如果定义了_BSD_SOURCE或_SVID_SOURCE特征测试宏,则Glibc使用st_atim.tv_nsec形式的名称公开每个字段的纳秒组件。这些字段在POSIX.1-2008中指定,并且从版本2.12开始,如果_POSIX_C_SOURCE定义为值200809L或更高,则glibc也会公开这些字段名称,或者_XOPEN_SOURCE定义为值700或更大。如果没有定义上述宏,则使用st_atimensec形式的名称公开纳秒值。在不支持亚秒时间戳的文件系统上,返回值为0的纳秒字段。
2)显然,makefile(“工作”)有一个Eclipse没有的#define,反之亦然。
可能是_POSIX_C_SOURCE和/或_XOPEN_SOURCE。
运行此命令以查看命令行(makefile?)环境中存在的内容:
gcc -dM -E - < /dev/null | less
3)请回复你找到的内容!
我在Eclipse中遇到了同样的问题:无法解析字段st_mtime(语义错误)
通过右键单击项目修复Eclipse中的问题,选择索引 - >“刷新所有文件”
#include <malloc.h>
#include <time.h>
#include <stdio.h>
static struct tm* alarmTime(void);
int main(){
printf("Hour :%i\n", alarmTime()->tm_hour);
printf("Minute :%i\n", alarmTime()->tm_min);
return 0;
}
static struct tm* alarmTime(void){
time_t now = time(NULL);
struct tm* ptm;
#ifdef HAVE_LOCALTIME_R
struct tm tmbuf;
ptm = localtime_r(&now, &tmbuf);
#else
ptm = localtime(&now);
#endif
return ptm;
}