printf 一个未知精确类型的整数

oli*_*ier 2 c

我已经把我的代码

typedef int myinteger ;
Run Code Online (Sandbox Code Playgroud)

但是,如果我将 typedef 更改为另一种整数类型,我希望我的所有代码继续有效。

现在我想 printf 一个类型的变量myinteger。这是一种正确的方法吗?我刚刚发现了以下“黑客”:

printf("%lld", myvariable) ;
Run Code Online (Sandbox Code Playgroud)

希望任何整数类型都适合 along long并且编译器会进行正确的转换。它似乎适用于 gcc(尽管我有一个警告)。printf是一个问题,但它们也可能是其他问题(例如找到最大的“myinteger”)。

更一般地说,是否有可能/希望尝试我尝试实现的目标,编写代码假设myinteger仅指某个整数类型?

P.P*_*.P. 5

没有可用于printf()打印任何整数类型的通用格式说明符。一种方法是转换为 C99intmax_tuintmax_t打印它:

#include <stdint.h>

printf("%jd\n", (intmax_t)myvariable);
printf("%ju\n", (uintmax_t)myvariable);
Run Code Online (Sandbox Code Playgroud)

这适用于所有整数类型,因为intmax_t/uintmax_t是类型最大宽度整数。

一般来说,随意更改typedef表明设计存在根本缺陷。


mik*_*u95 5

我建议:

typedef int my_type_t;
#define FMT_MY_TYPE "%d"
Run Code Online (Sandbox Code Playgroud)

然后:

my_type_t my_var = 0;
printf("Here is my_var: " FMT_MY_TYPE "\n", my_var);
Run Code Online (Sandbox Code Playgroud)

这甚至适用于结构。这是一个概括:

typedef struct { int a; int b; } my_struct_t;
#define FMT_MY_STRUCT "{a: %d, b: %d}"
#define FMT_MY_STRUCT_ARG(x) (x).a, (x).b
Run Code Online (Sandbox Code Playgroud)

然后:

my_struct_t my_var = {0, 1};
printf("Here is my_var: " FMT_MY_STRUCT "\n", FMT_MY_STRUCT_ARG(my_var));
Run Code Online (Sandbox Code Playgroud)