【问题标题】:What is the correct printf specifier for printing pid_t打印 pid_t 的正确 printf 说明符是什么
【发布时间】:2013-12-30 06:43:18
【问题描述】:

我目前正在使用显式转换为 long 并使用 %ld 打印 pid_t,是否有一个说明符,例如 %z for size_t for pid_t

如果不是打印pid_t 的最佳方式是什么?

【问题讨论】:

  • 我得到了。 %d hello.c:9:42: 警告:格式指定类型“long”,但当我尝试 ld 时,参数的类型为“pid_t”(又名“int”)[-Wformat]
  • @KorayTugay 请注意上面的文字:“我目前正在使用显式转换为 long”。

标签: c io printf pid


【解决方案1】:

没有这样的说明符。我认为你在做什么(将pid_t 转换为long 并用"%ld" 打印)很好;您可以使用更宽的 int 类型,但没有实现 pid_t 大于 long 并且可能永远不会。

【讨论】:

  • 不错。如果您想使用自己的 pid_t 规范自定义 printf,请查看此页面:stackoverflow.com/questions/9260170/…
  • 进程总数与操作系统的位数有关吗?例如,一个操作系统可以有更多的 sizeof(int) 吗?
  • 参见stackoverflow.com/questions/1922761/… ... pid_t 通常为 32 位,与操作系统位大小无关。一个系统可能有更大的,但我没想到。无论如何,为了安全起见,时间长了就足够了。
  • 嗯,如果pid_t is usually 32 bits, regardless of the OS bit size. 为真,那么在long 是64 位的实现上,使用"%ld" 打印肯定会导致问题。
  • @chux-ReinstateMonica 请阅读问题:“我目前正在使用显式强制转换为 long 并使用 %ld”——那就是我说的“很好”。当然,使用 %ld 而不保证传递 long 是有问题的。
【解决方案2】:

对于缺少匹配格式说明符的整数类型,例如 pid_t,但具有已知符号性1,转换为最广泛匹配的有符号类型并打印。

如果其他系统类型的符号性未知,则转换为最广泛的无符号类型或alternate opinion

pid_t pid = foo();

// C99
#include <stdint.h>
printf("pid = %jd\n", (intmax_t) pid);

或者

// C99
#include <stdint.h>
#include <inttypes.h>
printf("pid = %" PRIdMAX "\n", (intmax_t) pid);

或者

// pre-C99
pid_t pid = foo();
printf("pid = %ld\n", (long) pid);

1pid_t 数据类型是signed integer 类型,能够表示进程 ID。

【讨论】:

  • “如果符号性未知,则转换为最广泛的无符号类型”——我不建议这样做。转换为uintmax_t 并使用%ju 打印将错误地打印所有负值,而转换为intmax_t 并使用%jd 打印只会错误地打印值> INTMAX_MAX。 (话说回来,真正不知道一个类型是否包含负值的情况非常罕见。)
  • @JimBalter 公平点。在符号未知的情况下,存在错误地将负值打印为大值或将大值打印为负值的权衡。我希望当符号未知时,使用intmax_t 通常更自然,因为较小的值更常见,但是将 signed integer 转换为 uintmax_t 的定义更窄,不会丢失info (因此我的偏好)比 unsigned integerintmax_t 可以。 Choose your poison.
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 2019-11-30
  • 2013-06-22
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2013-03-14
相关资源
最近更新 更多