gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:08:16 25 4
gpt4 key购买 nike

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

我找到了this link这表明 rlim_t 是一个 unsigned 整数类型,因此我使用 PRIuMAX 宏作为转换说明符,将值转换为 ( uintmax_t)。我注意到我可以省略 Actor 阵容而不产生任何警告; Actor 阵容真的有必要吗?

在深入研究了几个头文件后,我发现 rlim_t 是我系统上 unsigned longtypedef。因此我还可以使用 %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_tunsigned 整数类型,转换为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com