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

标签 c types struct

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

相关文章:

c# - 如何传递参数来声明泛型类型列表?

types - 在 Erlang 中编写规范的指南

typescript - 如何实现通用的 First "case/switch"类型

c - 每个子进程的结构并访问成员

c - 这是一个合适的函数定义吗?

c - C 程序中的条件未给出所需的结果

c - 奇怪的未知 malloc 错误

json - 我如何在 Swift 中解码 JSON,它是一个包含双嵌套项目的数组?

c - C 中的字符输入和切换大小写有问题吗?

c - C中的字符串格式化