更正 C 中自定义整数类型的格式说明符以确保可移植性

Lon*_*ner 4 c portability cross-platform

我想知道什么是正确的printf自定义整数类型,如格式说明time_tsocklen_t等等。

例如,

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main()
{
    struct addrinfo *ai;

    if (getaddrinfo("localhost", "http", NULL, &ai) != 0) {
        printf("error\n");
        return EXIT_FAILURE;
    }

    printf("%d\n", ai->ai_addrlen);
}
Run Code Online (Sandbox Code Playgroud)

尽管该程序编译并运行良好,但我对使用定义为in类型的%dto 打印ai_addrlen并不满意socklen_tstruct addrinfo因为不能保证socklen_t是 type int

我们怎样才能正确地打印被定义为这样的整数socklen_ttime_t等等?我担心这里的便携性。当程序在具有不同定义的不同实现上编译时,我不应该修改格式说明符socklen_t

Bla*_*iev 5

使用中间转换 tointmax_t和说明%jd符:

printf("%jd\n", (intmax_t) ai->ai_addrlen);
Run Code Online (Sandbox Code Playgroud)

强制转换将整数放大为最大可能大小的整数,该整数能够表示任何其他有符号整数类型的值。这里有一个小小的警告:如果sizeof(intmax_t) == sizeof ai->addrlenai->addrlen是无符号的,不适合有符号整数 ( intmax_t) 的大值将被截断。

如果您确定打印的类型是无符号的,请使用uintmax_t%ju代替。

j字符是一个“长子指定符”特别适合于处理的大小intmax_t/uintmax_t和其可与一起去di说明符字符(intmax_t)或uoXx字符(uintmax_t)。