我已经把我的代码
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仅指某个整数类型?
没有可用于printf()打印任何整数类型的通用格式说明符。一种方法是转换为 C99intmax_t或uintmax_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表明设计存在根本缺陷。
我建议:
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)