gpt4 book ai didi

c - 如何在 C 中检查变量是否属于某种类型(比较两种类型)?

转载 作者:太空狗 更新时间:2023-10-29 16:18:04 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com