我typedef在 C 中尝试使用'd 变量时遇到的问题之一是弄清楚实际的原始类型是什么,typedef以便%在尝试使用printf. 大多数时候我不得不参考gcc. 例如,使用时,stat系统调用,返回的结构有很多不同成员的typedef“d类型的喜欢dev_t,ino_t,mode_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
Run Code Online (Sandbox Code Playgroud)
这是大多数人在打印 typedef 时使用它们的方式吗?这难道不是因为你需要知道真正的原始生命typedef是什么吗?有没有更好的方法来完全抽象实际类型?
这些类型没有独立于系统的定义。 POSIX只说它们是“适当长度的算术类型”。所以,即使你从编译器警告,推断dev_t是int你的系统上,你将有问题,当你移动到其他系统,在那里可能是unsigned short或long int,甚至,从理论上说,float。
通常您通过强制转换来处理这个问题,因此传递给的printf内容至少是已知类型的。 uintmax_t在这方面很方便,因为它当然应该足够大,并且它有一个格式说明符%ju。所以你可以写:
printf("block size for file system IO: %ju\n", (uintmax_t)(s->st_blksize));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |