我正在使用getrlimit()
函数来获取系统上的最大堆栈大小。此函数将struct
中的当前限制和最大限制存储在两个rlim_t
字段中。我想打印这些值。
我发现this link表明rlim_t
是unsigned
整数类型,所以我使用PRIuMAX
宏作为转换说明符,将值转换为{{1 }}。我注意到我可以在不产生任何警告的情况下省略演员阵容;演员真的有必要吗?
在挖掘了几个头文件后,我发现(uintmax_t)
在我的系统上是rlim_t
typedef
。所以我也可以使用unsigned long
转换说明符,并取消强制转换。
我认为我不能认为%lu
始终是rlim_t
,因此使用第一种方法来提高可移植性似乎更好。我发现this answer表明unsigned long
可能并非始终是%llu
的有效转化说明符,并且主张投放到rlim_t
。打印long long
类型值的最佳方法是什么?
这是一个简短的说明性程序:
rlim_t
答案 0 :(得分:2)
正如对原始问题的评论中所提到的,强制转换是确保类型与转换规范匹配所必需的。系统标头可能未将rlim_t
的类型定义为uintmax_t
,但由于rlim_t
是unsigned
整数类型,因此转换为uintmax_t
是安全的。
使用PRIuMAX
宏的上述解决方案很好,但由于C99还有j
类型修饰符,用于打印intmax_t
和uintmax_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);