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

标签 c

我正在使用 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/

相关文章:

c - 如何在 C 中使用 "full string"中的 strtok() 后组合字符串并将其存储在数组中

c - 将 64 位代码移植到 32 位机器

c - pthread_create 给出一个段错误

c - C中要同步的字符串

c - 数组数组的指定初始化器

c - 在 C 中减去两个带符号的 32 位数字时如何检测溢出?

c - malloc 函数扰乱数组项 (C)

C 程序 printf 的令人困惑的行为

在嵌入式编程中 main 启动之前检查 GPIO 的状态

c++ - 可见性属性应该在声明中还是在定义中指定?