C:在没有 gcc 警告的情况下找出 typedef 的 % 格式说明符?

标签 c typedef

我在 C 中尝试使用 typedef 变量时遇到的一个问题是弄清楚已经 typedef 的实际原始类型是什么,所以我尝试使用 printf 打印其值时,可以使用适当的 % 说明符。大多数时候我必须引用 gcc 产生的警告。例如,当使用 stat 系统调用时,返回的结构有很多具有不同 typedef 类型的成员,例如 dev_t ino_tmode_t 等,我通常不得不猜测格式说明符可能是什么,然后编译器会警告我,我会更正它:

stat_demo.c: In function ‘main’:
stat_demo.c:46:45: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__blksize_t’ {aka ‘long int’} [-Wformat=]
   46 |     printf("block size for file system IO: %d\n", s->st_blksize);
      |                                            ~^     ~~~~~~~~~~~~~
      |                                             |      |
      |                                             int    __blksize_t {aka long int}
      |                                            %ld

这是大多数人在打印时使用 typedef 的方式吗?这不是违背了要点吗,因为您需要知道 typedef 的实际原语是什么?有没有更好的方法来完全抽象实际类型?

最佳答案

这些类型没有独立于系统的定义。 POSIX只说它们是“适当长度的算术类型”。因此,即使您从编译器警告中推断出 dev_t 在您的系统上是 int,当您移动到其他可能是 unsigned 的系统时,您也会遇到问题shortlong int 甚至理论上是 float

通常您通过转换来处理此问题,因此传递给 printf 的内容至少是已知类型。 uintmax_t 在这方面很方便,因为它当然应该足够大,并且它有一个格式说明符 %ju。所以你可以这样写:

printf("block size for file system IO: %ju\n", (uintmax_t)(s->st_blksize));

关于C:在没有 gcc 警告的情况下找出 typedef 的 % 格式说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68594970/

相关文章:

objective-c - 在 Objective-C 中在另一个自定义类中使用自定义类

C 崩溃中的检查控制台游戏

代码没有读取整个字符串

c - 使用 TCP 通过套接字传输文件时卡住

C++ typedef 和模板

c - 获取该行的每个字符,然后对其进行加密

c++ - 为什么类级别的 typedef 不从模板继承?

c - 为什么此 typedef 代码不创建实例

c++ - using-style 和 typedef-style 有什么区别?

c - typedef 结构说明