目前,在C11中使用_Generic
泛型选择可以获取变量的类型。它在编译时工作。
语法有点像switch
。以下是一个示例(来自这个答案):
#define typename(x) _Generic((x), \
_Bool: "_Bool", unsigned char: "unsigned char", \
char: "char", signed char: "signed char", \
short int: "short int", unsigned short int: "unsigned short int", \
int: "int", unsigned int: "unsigned int", \
long int: "long int", unsigned long int: "unsigned long int", \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
float: "float", double: "double", \
long double: "long double", char *: "pointer to char", \
void *: "pointer to void", int *: "pointer to int", \
default: "other")
要在编译时进行手动类型检查,您可以定义一个包含您期望的所有类型的enum
,类似于此:
为了实际使用它进行编译时手动类型检查,您可以定义一个enum
,其中包含您所期望的所有类型,例如:
enum t_typename {
TYPENAME_BOOL,
TYPENAME_UNSIGNED_CHAR,
TYPENAME_CHAR,
TYPENAME_SIGNED_CHAR,
TYPENAME_SHORT_INT,
TYPENAME_UNSIGNED_CHORT_INT,
TYPENAME_INT,
TYPENAME_POINTER_TO_INT,
TYPENAME_OTHER
};
然后使用 _Generic
将类型与此 enum
匹配:
#define typename(x) _Generic((x), \
_Bool: TYPENAME_BOOL, unsigned char: TYPENAME_UNSIGNED_CHAR, \
char: TYPENAME_CHAR, signed char: TYPENAME_SIGNED_CHAR, \
short int: TYPENAME_SHORT_INT, unsigned short int: TYPENAME_UNSIGNED_SHORT_INT, \
int: TYPENAME_INT, \
\
int *: TYPENAME_POINTER_TO_INT, \
default: TYPENAME_OTHER)
0.00
)吗?不确定在C语言中是否可能,只是一个建议。 - Kevin