【发布时间】:2017-01-17 22:59:24
【问题描述】:
我想知道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 打印ai_addrlen,它在struct addrinfo 中定义为socklen_t 类型,因为不能保证socklen_t 是类型int.
我们如何才能正确打印定义为socklen_t、time_t 等的整数?我担心这里的可移植性。当程序在具有不同socklen_t 定义的不同实现上编译时,我不必修改格式说明符。
【问题讨论】:
-
除了
size_t之外,没有任何其他标准(C、POSIX 或其他)类型的特殊格式。你必须真正知道底层类型是什么。幸运的是 GCC 和 Clang 非常擅长了解它,如果您使用错误的格式会给出警告。不幸的是,如果您的代码必须构建在具有不同类型大小的不同平台上,这并没有真正的帮助。 -
您没有显示
struct,但对于size_t,您使用printf("%zu", ...); -
@WeatherVane:
long long不能保证是最大的可用整数,尽管在大多数当前实现中它是。 C99 为此明确定义了intmax_t。 -
@BlagovestBuyukliev 我很抱歉,
intmax_t在stdint.h谢谢。 -
@Joachim Pileborg 关于“除了
size_t之外,没有任何其他标准......类型的特殊格式”。有t对应ptrdiff_t,例如"td"和j对应(u)intmax_t。还有SCN...和PRI...宏,其中包含适用于这些类型的 some 字符串。
标签: c cross-platform portability