在GNU系统中使用printf打印size_t

时间:2017-09-06 20:09:15

标签: c printf gnu c89 size-t

在我阅读article时,我看到了这一段:

  

同样,不要努力迎合长度小于size_t等预定义类型的可能性。例如,以下代码可以:

printf ("size = %lu\n", (unsigned long) sizeof array);
printf ("diff = %ld\n", (long) (pointer2 - pointer1));
  1989年标准C要求它工作,我们只知道一个反例:Microsoft Windows上的64位程序。我们将离开它   那些想要将GNU程序移植到该环境中的人   如何做到这一点。

1989标准C真的允许该代码吗?

1 个答案:

答案 0 :(得分:3)

问的问题是:

  

1989标准C真的允许该代码吗?

是的,如果通过"允许"我们的意思是"这将编译和运行,做一些合理的事情而不会触发未定义的行为" (而不是"这将做我想要的")。这两个案例略有不同。

对于size_t,如果结果太大,结果将被截断。对于ptrdiff_t,如果结果太大,结果将是实现定义。

但是,最新版本的Visual Studio(_MSC_VER >= 1800)支持zt转换(无论如何都是C ++ 11支持所必需的),因此您可以使用:

size_t size;
printf("size = %zu\n", size);
ptrdiff_t diff;
printf("diff = %td\n", diff);

这也适用于其他系统(GNU,BSD,Darwin)。对于旧版本的Visual Studio,有其他选择,但需要在不同平台上使用不同的格式字符串。

关于GNU编码标准的说明

GNU编码标准适用于GNU组织,它有一些非常具体的目标,并不关心支持Windows。除非你有特定的理由要遵循它们(例如,你希望你的项目在未来成为一个GNU项目),否则我会把它们的编码标准放在一边。(