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および最初のmacosxバージョンでは、int(time_t)から構造体に割り当てています。他の2つのバージョンでは、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 に答える