我正在使用 getrlimit()
函数来获取系统上的最大堆栈大小。此函数将当前限制和最大限制存储在具有两个 rlim_t
字段的 struct
中。我想打印这些值。
我找到了this link这表明 rlim_t
是一个 unsigned
整数类型,因此我使用 PRIuMAX
宏作为转换说明符,将值转换为 ( uintmax_t)
。我注意到我可以省略 Actor 阵容而不产生任何警告; Actor 阵容真的有必要吗?
在深入研究了几个头文件后,我发现 rlim_t
是我系统上 unsigned long
的 typedef
。因此我还可以使用 %lu
转换说明符,并取消强制转换。
我认为我不能假设rlim_t
始终是unsigned long
,因此似乎使用第一种方法来提高可移植性更好。我发现this answer这表明 %llu
可能并不总是 rlim_t
的有效转换说明符,并提倡转换为 long long
。打印 rlim_t
类型的值的最佳方法是什么?
这是一个简短的说明性程序:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <sys/resource.h>
int main(void)
{
struct rlimit stacklim;
rlim_t cur_bytes, max_bytes;
if (getrlimit(RLIMIT_STACK, &stacklim) == 0) {
cur_bytes = stacklim.rlim_cur;
max_bytes = stacklim.rlim_max;
} else {
perror("Error in getrlimit()");
exit(EXIT_FAILURE);
}
puts("Maximum Stack Size");
printf("Soft limit: %" PRIuMAX " bytes\n", (uintmax_t)cur_bytes);
printf("Hard limit: %" PRIuMAX " bytes\n", (uintmax_t)max_bytes);
return 0;
}
最佳答案
正如原始问题的评论中提到的,强制转换对于确保类型与转换规范匹配是必要的。系统 header 可能不会将 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);
关于c - 打印 rlim_t 类型的值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581232/