2012-04-25 1 views
1

Cのmtime構造体の実装で問題が発生しました。ファイルの最終更新時刻を確認しようとしています。コンパイルするとき、私はこのエラーが表示されます。time_tを使用してCの最後の修正時刻を確認する際の問題

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; 
} 

そして、構造体のSTAT:

struct stat 
{ time_t  st_mtime; }; 

P.S.フォーマットについて申し訳ありませんが、フォーマットがなぜこのように機能しているのかわかりません。 Linuxでこれを実行する。助けを前にありがとう。

+0

ヒントとして、他のケースが行っていることを見て、あなたが示した 'struct stat'スニペットと比較してください。 (そのうちの1人はすでに正しいことをしています) – geekosaur

+0

私はあなたのことを理解していると思いますが、 'stuct stat'を削除した場合、「s」の記憶容量が初期化されていないコンパイル時エラーが発生します。この理由から 'struct stat'が必要でしたか? – joethecoder

+0

いいえ、あなたは私のことを理解していませんでした。あなたが引用した 'st_mtime'のタイプと比較して、他のケースが何をしているのかを考えてください。 – geekosaur

答えて

0

linuxと最初のmac os xバージョンでは、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; 
} 
+0

私は本当に理由を理解しているかどうかはわかりませんが、ありがとうございます。 – joethecoder

0

コンパイラは、型の互換性がないと言いましたが、明らかにそうです。