如果所有代碼需要做的是打印整數,以及使用C99或C11,使用_Generic
選擇匹配打印說明符。
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#define IntegerFormat3(X) _Generic((X), \
size_t: "%zu", \
ptrdiff_t: "%td", \
default: 0 \
)
#define IntegerFormat2(X) _Generic((X), \
intmax_t: "%jd", \
uintmax_t: "%ju", \
default: IntegerFormat3(X) \
)
#define IntegerFormat(X) _Generic(X, \
_Bool: "%d", \
char: "%c", \
signed char: "%hhd", \
unsigned char: "%hhu", \
short: "%hd", \
unsigned short: "%hu", \
int: "%d", \
unsigned: "%u", \
long: "%ld", \
unsigned long: "%lu", \
long long: "%lld", \
unsigned long long: "%llu", \
default: IntegerFormat2(X) \
)
int main(void) {
int i = 12;
unsigned long long u = 34;
size_t sz = 56;
printf(IntegerFormat(i), i);
printf(IntegerFormat(u), u);
printf(IntegerFormat(sz), sz);
return 0;
}
不幸的是printf(IntegerFormat(i) "\n", i);
不起作用。
另一種C格式化打印方法任意編碼類型相關說明符Formatted print without the need to specify type matching specifiers using _Generic。
儘管如此,鑄造最廣泛匹配標誌岬型被別人當作回答很簡單。
我會帶葉出C99的書,他們定義了幾個宏的對格式,如'uint64_t'(對於該格式是'PRIu64'宏)。只需要添加一個'#define MYINT_F「%d」'來與'typedef'一起使用,並根據類型 –