1

所以我在 C 中实现 mtime 结构时遇到了麻烦,我试图检查文件的最后修改时间。编译时,我收到此错误:

pr8.1.c:246: error: incompatible types when assigning to type struct timespec from type time_t make: *** [pr8] Error 1

我为此使用的代码如下:

static struct timespec mtime(const char *file)
{
    struct stat s;
    struct timespec t = { 0, 0 };

    if (stat(file, &s) == 0)
#if     defined(MTIME) && MTIME == 1    // Linux
    { t = s.st_mtime; }
#elif   defined(MTIME) && MTIME == 2    // Mac OS X
    { t = s.st_mtimespec; }
#elif   defined(MTIME) && MTIME == 3    // Mac OS X, with some additional settings
    { t.tv_sec = s.st_mtime; t.tv_nsec = s.st_mtimensec; }
#else                                   // Solaris
    { t.tv_sec = s.st_mtime; }
#endif

    return t;
}

和结构统计:

struct stat
{ time_t        st_mtime; };

PS对格式感到抱歉,我不确定为什么格式会这样。在 Linux 上运行它。在此先感谢您的帮助。

4

2 回答 2

0

编译器告诉你这些类型是不兼容的,他们显然是。

于 2012-04-25T23:53:44.503 回答
0

在 linux 和第一个 mac os x 版本中,您从 int (time_t) 分配给结构。在其他两个版本中,您正确地将 s 的成员分配给 t 的成员。如果你改变这个,你得到正确的操作吗?

static struct timespec mtime(const char *file)
{
    struct stat s;
    struct timespec t = { 0, 0 };

    if (stat(file, &s) == 0)
#if     defined(MTIME) && MTIME == 1    // Linux
    { t.tv_sec = s.st_mtime; }
//     ^^^^^^^ 
#elif   defined(MTIME) && MTIME == 2    // Mac OS X
    { t.tv_sec = s.st_mtimespec; }
//     ^^^^^^^ 
#elif   defined(MTIME) && MTIME == 3    // Mac OS X, with some additional settings
    { t.tv_sec = s.st_mtime; t.tv_nsec = s.st_mtimensec; }
#else                                   // Solaris
    { t.tv_sec = s.st_mtime; }
#endif

    return t;
}
于 2012-04-25T23:53:48.893 回答