打印rlim_t类型值的正确方法是什么?

时间:2017-01-11 01:17:01

标签: c

我正在使用getrlimit()函数来获取系统上的最大堆栈大小。此函数将struct中的当前限制和最大限制存储在两个rlim_t字段中。我想打印这些值。

我发现this link表明rlim_tunsigned整数类型,所以我使用PRIuMAX宏作为转换说明符,将值转换为{{1 }}。我注意到我可以在不产生任何警告的情况下省略演员阵容;演员真的有必要吗?

在挖掘了几个头文件后,我发现(uintmax_t)在我的系统上是rlim_t typedef。所以我也可以使用unsigned long转换说明符,并取消强制转换。

我认为我不能认为%lu始终是rlim_t,因此使用第一种方法来提高可移植性似乎更好。我发现this answer表明unsigned long可能并非始终是%llu的有效转化说明符,并且主张投放到rlim_t。打印long long类型值的最佳方法是什么?

这是一个简短的说明性程序:

rlim_t

2 个答案:

答案 0 :(得分:2)

正如对原始问题的评论中所提到的,强制转换是确保类型与转换规范匹配所必需的。系统标头可能未将rlim_t的类型定义为uintmax_t,但由于rlim_tunsigned整数类型,因此转换为uintmax_t是安全的。

使用PRIuMAX宏的上述解决方案很好,但由于C99还有j类型修饰符,用于打印intmax_tuintmax_t类型的值:

printf("Soft limit: %ju bytes\n", (uintmax_t)cur_bytes);
printf("Hard limit: %ju bytes\n", (uintmax_t)max_bytes);

答案 1 :(得分:-2)

我相信这是一个无条件的长期。

printf("Soft limit: %lu" PRIuMAX " bytes\n", cur_bytes);
printf("Hard limit: %lu" PRIuMAX " bytes\n", max_bytes);