我知道这必须是一个简单的警告但我无法解决它。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_PATH "/sdcard/ex_file.txt"
static time_t time_now;
int main()
{
struct stat f_stat;
stat(FILE_PATH, &file_stat);
time_now = time(&time_now);
if (file_stat.st_mtime > time_now)
unlink(FILE_PATH)
}
在这个简单的程序中,我会在if (file_stat.st_mtime > time_now))
收到警告。我正在Android环境中编译源代码。
可能是什么问题?这两个都是time_t
变量。
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
答案 0 :(得分:4)
tl; dr :这会因平台而异,但struct stat
并非(始终)定义为time_t
,因此您会遇到此警告在time_t
和unsigned long
不同的任何平台上。
time_t
只是__kernel_time_t
的typedef,无论如何它通常都是typedef,但这可能因平台而异。
现在,struct stat
不会始终定义time_t
,例如,在我刚刚检查的Ubuntu 12.04服务器(x64)上,实际{{1} } header在其定义中有这个:
stat.h
如您所见,它明确定义为struct stat {
/** .............. **/
unsigned long st_atime;
unsigned long st_atime_nsec;
unsigned long st_mtime;
unsigned long st_mtime_nsec;
unsigned long st_ctime;
unsigned long st_ctime_nsec;
};
,而不是unsigned long
。现在,此服务器也恰好将time_t
定义为time_t
,其定义为:
__kernel_time_t
因此,当我尝试编译代码时(在清理语法问题并用真实文件替换typedef __kernel_long_t __kernel_time_t;
之后),所有内容都编译良好且没有警告,因为在这种情况下FILE
和time_t
是一回事。
感谢shree.pat18的评论,你可以看到android的stat.h如何使用unsigned long
:
http://www.netmite.com/android/mydroid/bionic/libc/include/sys/stat.h
以及types.h如何定义&#34; time_t&#34; as&#34; __ kernel_time_t&#34; http://www.netmite.com/android/mydroid/bionic/libc/include/sys/types.h
&#34; __ kernel_time_t&#34;被定义为&#34; long&#34; (并且不&#34; unsigned long&#34;,这就是您收到警告的原因): http://www.netmite.com/android/mydroid/kernel/include/asm-x86/posix_types_64.h