比较两个time_t变量会生成编译器警告

时间:2014-06-12 03:39:49

标签: c compiler-construction

我知道这必须是一个简单的警告但我无法解决它。

#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]

1 个答案:

答案 0 :(得分:4)

tl; dr :这会因平台而异,但struct stat并非(始终)定义为time_t,因此您会遇到此警告在time_tunsigned long不同的任何平台上。

linux中的

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; 之后),所有内容都编译良好且没有警告,因为在这种情况下FILEtime_t是一回事。

修改

感谢shree.pat18的评论,你可以看到android的stat.h如何使用unsigned longhttp://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