【问题标题】:warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘__dev_t’ [-Wformat=]警告:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“__dev_t”[-Wformat=]
【发布时间】:2018-04-22 07:34:25
【问题描述】:

我在程序中使用 stat 文件系统,我想使用

打印设备 ID

printf("\nst_dev = %s\n",buf.st_dev);

但我收到错误:

警告:格式“%s”需要“char *”类型的参数,但参数 2 具有类型“__dev_t”[-Wformat=]

这里应该用什么 b 代替 %s?

【问题讨论】:

  • __dev_t 是什么都没有格式说明符......也许你应该得到some documentation
  • 相关:stackoverflow.com/questions/9635702/… .. 打印它不是 dev_t 的预期用途。当然,如果您知道底层数据类型,您可以打印它,但是您的程序不再是可移植的。

标签: c linux stat


【解决方案1】:

st_devdev_t 类型,根据POSIX definition,它是一个整数类型

dev_t 应为整数类型。

所以使用%s 打印肯定是错误的。没有可移植的方式来打印它,因为在 POSIX 中没有为它定义格式说明符。您可以使用intmax_t 打印它:

printf("\nst_dev = %jd\n", (intmax_t)buf.st_dev);

如果 intmax_t 不可用(例如 C89 系统),那么您可以将其转换为 long

【讨论】:

    【解决方案2】:

    dev_t(又名__dev_t)没有特定的格式说明符,但它应该是某种整数类型。如果您遵循 typedef 的兔子洞并在标准头文件中定义,您最终应该会到达该类型的基本定义。在我的系统上,链条是:

    typedef __dev_t dev_t;
    __STD_TYPE __DEV_T_TYPE __dev_t;
    #define __DEV_T_TYPE        __UQUAD_TYPE
    #define __UQUAD_TYPE        __u_quad_t
    __extension__ typedef unsigned long long int __u_quad_t;
    

    因此%lu 可以工作。它在您的系统上可能有所不同,但很可能类似于 unsigned long int。当您遇到这些事情时,调查这些事情通常会有所帮助,您永远不知道您可能会了解到事情是如何运作的。

    【讨论】:

    • 问题是你“学到”的东西只适用于你的特定系统;在其他一些系统上可能会有所不同
    • 很公平,也许更准确地说,看看事情是如何运作的,而不是本身有用。在这种情况下,我认为您可以通过简单的演员阵容解决问题,但显然并不总是那么容易。
    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多