我想知道针对自定义整数类型(例如time_t、socklen_t等),正确的printf格式说明符是什么。
例如,
尽管程序可以正常编译和运行,但我不喜欢使用
我们如何正确打印像
例如,
#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);
}
尽管程序可以正常编译和运行,但我不喜欢使用
%d
来打印struct addrinfo
中定义为socklen_t
类型的ai_addrlen
,因为不能保证socklen_t
是int
类型。我们如何正确打印像
socklen_t
、time_t
等所定义的整数呢?我关注的是移植性。当在不同实现上编译程序时,不应该修改格式说明符。
size_t
之外,对于其他标准(C、POSIX或其他)类型没有特殊的格式。您必须实际上知道基础类型是什么。幸运的是,GCC和Clang非常擅长知道它,并且如果您使用错误的格式,它们会发出警告。不幸的是,如果您的代码需要在具有不同类型大小的不同平台上构建,这并不能真正帮助到您。 - Some programmer dudeprintf("%llu", (unsigned long long)ai->ai_addrlen);
- Weather Vanelong long
并不能保证是最大的可用整数,尽管在大多数当前的实现中它是。C99明确定义了intmax_t
来满足这个目的。 - Blagovest Buyuklievintmax_t
在stdint.h
中,谢谢。 - Weather Vanesize_t
之外,没有任何其他标准..类型的特殊格式"。对于ptrdiff_t
,有t
,如"td"
,以及(u)intmax_t
的j
。此外,还有包含适用于这些类型的某些字符串的SCN...
和PRI...
宏。 - chux - Reinstate Monica