在 C(不是 C++/C#)中,如何检查变量是否属于特定类型?
例如,像这样:
double doubleVar;
if( typeof(doubleVar) == double ) {
printf("doubleVar is of type double!");
}
或更笼统:如何比较两种类型,以便 compare(double1,double2)
的计算结果为 true,而 compare(int,double)
的计算结果为错误的。我也想比较不同组成的结构。
基本上,我有一个函数可以对“struct a”和“struct b”类型的变量进行操作。我想用“struct a”变量做一件事,用“struct b”变量做另一件事。由于 C 不支持重载并且 void
指针丢失了它的类型信息,因此我需要检查类型。顺便说一句,如果不能比较类型,那么使用 typeof
运算符有什么意义?
sizeof 方法对我来说似乎是一个实用的变通解决方案。谢谢你的帮助。我仍然觉得这有点奇怪,因为类型在编译时是已知的,但如果我想象我可以看到机器中的进程,为什么信息不是按类型存储,而是按字节大小存储。除了地址之外,大小是唯一真正相关的东西。
最佳答案
截至目前,在 C11 中通过 _Generic
泛型选择可以获取变量的类型。它在编译时工作。
语法有点像switch
。这是一个示例(来自 this answer ):
#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 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)
关于c - 如何在 C 中检查变量是否属于某种类型(比较两种类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280055/