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

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘__dev_t’ [-Wformat=]

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

打印设备 ID

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

但我收到错误消息:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘__dev_t’ [-Wformat=]

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

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

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。当您遇到这些事情时,调查这些事情通常会有所帮助,您永远不知道您可能会了解事情的幕后工作原理。

st_devdev_t 类型,根据 POSIX definition:

整数类型

dev_t shall be an integer type.

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

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

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