Lon*_*ner 4 c portability cross-platform
我想知道什么是正确的printf自定义整数类型,如格式说明time_t,socklen_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_t,struct addrinfo因为不能保证socklen_t是 type int。
我们怎样才能正确地打印被定义为这样的整数socklen_t,time_t等等?我担心这里的便携性。当程序在具有不同定义的不同实现上编译时,我不应该修改格式说明符socklen_t。
使用中间转换 tointmax_t和说明%jd符:
printf("%jd\n", (intmax_t) ai->ai_addrlen);
Run Code Online (Sandbox Code Playgroud)
强制转换将整数放大为最大可能大小的整数,该整数能够表示任何其他有符号整数类型的值。这里有一个小小的警告:如果sizeof(intmax_t) == sizeof ai->addrlen和ai->addrlen是无符号的,不适合有符号整数 ( intmax_t) 的大值将被截断。
如果您确定打印的类型是无符号的,请使用uintmax_t和%ju代替。
该j字符是一个“长子指定符”特别适合于处理的大小intmax_t/uintmax_t和其可与一起去d或i说明符字符(intmax_t)或u,o,X和x字符(uintmax_t)。