这个例子基于@Pedro Henrique A. Oliveira的答案使用了C11泛型。
注意,它还可以添加更多类型(ssize_t size_t intptr_t
等)。
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <float.h>
#include <stdint.h>
#define TYPEOF_MAX(x) \
_Generic(x, \
bool: 1, \
char: CHAR_MAX, signed char: SCHAR_MAX, unsigned char: UCHAR_MAX, \
signed short: SHRT_MAX, unsigned short: USHRT_MAX, \
signed int: INT_MAX, unsigned int: UINT_MAX, \
signed long: LONG_MAX, unsigned long: ULONG_MAX, \
signed long long: LLONG_MAX, unsigned long long: ULLONG_MAX, \
float: FLT_MAX, double: DBL_MAX)
#define TYPEOF_MIN(x) \
_Generic(x, \
bool: 0, \
char: CHAR_MIN, signed char: SCHAR_MIN, unsigned char: 0, \
signed short: SHRT_MIN, unsigned short: 0, \
signed int: INT_MIN, unsigned int: 0, \
signed long: LONG_MIN, unsigned long: 0, \
signed long long: LLONG_MIN, unsigned long long: 0, \
float: -FLT_MAX, double: -DBL_MAX)
_Static_assert(TYPEOF_MAX((char)4) > 100, "example check");
int main(void)
{
short num_short;
int num_int;
double num_double;
signed char num_char;
printf(" %ld max short\n", TYPEOF_MAX(num_short));
printf(" %ld max int\n", TYPEOF_MAX(num_int));
printf(" %f max double\n", TYPEOF_MAX(num_double));
printf(" %ld max char\n", TYPEOF_MAX(num_char));
return 0;
}
#include <limits.h>
然后使用INT_MAX
等。如果您有一个非内置但无符号类型T
,也可以使用((T)-1)
来获取最大值。 - The Paramagnetic Croissant