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和传递了一个论点st_atime

4

2 回答 2

8

与从 0 开始计数的 C(数组元素 :-) 不同,gcc 从 1 开始计数函数参数。因此,在 中printf (fmt, value),“参数 1”指的是fmt,而“参数 2”指的是value。容易,不是吗?

至于 printf an 的正确整数类型__off_t,目前还没有 100% 保证和可移植的方式。您最好的选择是将其转换为您的实现支持的最广泛的无符号类型。请注意,anunsigned long可能只有 32 位宽,您会遇到文件 >= 4GB 的问题。如果你有一个 C99 实现,或者它支持unsigned long long,你应该没问题

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

在当前的 POSIX 标准化小组中进行了讨论,以提供更多与其他 POSIX 类型(如 等)匹配的 printf() 格式说明符off_tpid_t一旦完成(不要屏住呼吸),打印文件大小将更便携,并且优雅的。

于 2013-03-01T20:57:44.600 回答
3

我收到上述错误消息,但我不明白为什么。我的印象是我只为st_size和传递了一个论点st_atime

但是您将两个参数传递给printf,

  1. 格式字符串
  2. 结构成员

第二个参数是 type __off_t,但格式是int参数。正确的格式__off_t是什么,我不知道,%ld或者%zd很有可能是正确的,但是为了安全起见,转换为intmax_t并使用%jd.

于 2013-03-01T20:40:54.710 回答