6
int lsdetails(struct stat *astatbuff) {
    printf("%d", astatbuff->st_size);
    printf("%d", astatbuff->st_atime);
    printf("%s\n", getpwuid(astatbuff->st_uid)->pw_name);

    return 0;
    }

警告: フォーマット '%d' はタイプ 'int' の引数を想定していますが、引数 2 のタイプは '__off_t' [-Wformat]

上記のエラー メッセージが表示されましたが、その理由がわかりません。st_sizeと の両方に1 つの引数しか渡していないという印象を受けていますst_atime

4

2 に答える 2

8

0からカウントを開始するC(配列要素:-)とは異なり、gccは1から関数引数のカウントを開始します。したがって、printf (fmt, value)では、「引数1」はを参照しfmt、「引数2」はを参照しvalueます。簡単ですね。

printf anの正しい整数型に関しては__off_t、現在、100%保証された移植可能な方法はありません。最善の策は、実装がサポートする最も広い符号なしタイプにキャストすることです。unsigned longは32ビット幅しかない場合があり、4GBを超えるファイルで問題が発生することに注意してください。C99の実装がある場合、またはそれがサポートしている場合はunsigned long long

printf("%llu", (unsigned long long)astatbuff->st_size);

現在のPOSIX標準化グループではoff_tpid_tなどの他のPOSIXタイプと一致するprintf()形式指定子をさらに提供するための議論があります。エレガント。

于 2013-03-01T20:57:44.600 に答える
3

上記のエラーメッセージが表示されますが、理由がわかりません。私はとの両方に対して1つの引数しか渡していないという印象を受けていst_sizeますst_atime

しかし、あなたはに2つの引数を渡していますprintf

  1. フォーマット文字列
  2. 構造体メンバー

2番目の引数はタイプ__off_tですが、形式はint引数用です。正しい形式と__off_tは、わからない、%ldまたは%zd正しい可能性が高いのですが、安全に再生するには、キャストしintmax_tて使用します%jd

于 2013-03-01T20:40:54.710 に答える