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

时间:2018-04-22 07:34:26

标签: c linux stat

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

打印设备ID

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

但我收到错误:

  

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

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

2 个答案:

答案 0 :(得分:0)

dev_t(aka __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类似。当你遇到这些东西时,调查这些东西通常很有帮助,你永远不知道你可以从中了解如何在幕后工作。

答案 1 :(得分:0)

st_dev的类型为dev_t,根据POSIX definition整数类型

  

dev_t应为整数类型。

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

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

如果intmax_t不可用(例如C89系统),那么您可以将其投放到long