C 是否有一种可移植的方式来查询void*指针的类型?

C 是否有一种可移植的方式来查询void*指针的类型?,c,type-conversion,void-pointers,C,Type Conversion,Void Pointers,基本问题:是否有一种可移植的(或至少是大多数编译器中都有的库)方法可以在运行时查询void*指针的类型?特别是,可以确定指针是struct x类型还是struct y类型(例如) 其他信息:我知道gcc提供了运算符的类型,但我想要一种更便携、更少依赖于编译器的方式来完成同样的事情 要求: 不能完全依赖于编译器。这包括编译器特定的宏和大多数编译器中不常用的其他功能 我更喜欢在任何编译器上工作的函数,而不是任何可移植性较差的实现(尽管我会接受最适合我的目标的答案) 建议在库中使用不在C11函数中的函

基本问题:是否有一种可移植的(或至少是大多数编译器中都有的库)方法可以在运行时查询void*指针的类型?特别是,可以确定指针是struct x类型还是struct y类型(例如)

其他信息:我知道gcc提供了运算符的类型,但我想要一种更便携、更少依赖于编译器的方式来完成同样的事情

要求

  • 不能完全依赖于编译器。这包括编译器特定的宏和大多数编译器中不常用的其他功能

  • 我更喜欢在任何编译器上工作的函数,而不是任何可移植性较差的实现(尽管我会接受最适合我的目标的答案)

  • 建议在库中使用不在C11函数中的函数是可以的,但在大多数编译器中都可以找到。确保你解释了它的工作原理和论点



  • 你所要求的是不可能的。根据定义,
    void*
    指针是通用指针。它可以向任何类型的指针转换,也可以从任何类型的指针转换;无法确定它所指向的数据类型(如果有的话!)。

    您所要求的是不可能的。根据定义,
    void*
    指针是通用指针。它可以向任何类型的指针转换,也可以从任何类型的指针转换;无法确定它指向哪种类型的数据(如果有的话!)。

    如果我试图访问一个不存在的字段或转换为错误的类型,会不会有问题?根据定义,唯一可移植的,要做到这一点,不容易出错的方法是让函数接受另一个参数,指定void*指针的类型?@Isaiah取决于您计划如何使用该指针,但一般来说,是的。@Isiah:如果您需要将
    void*
    强制转换为其他类型,您需要知道它实际指向的类型。如果您的代码设计为该指针只有一种可能的类型,那么您可以强制转换为该类型。但是,如果存在任何歧义,那么您需要第二个参数来指示类型。当我看到
    不可能
    +1时。如果我尝试访问一个不存在的字段或转换为错误的类型会有问题吗?根据定义,唯一可移植的,要做到这一点,不容易出错的方法是让函数接受另一个参数,指定void*指针的类型?@Isaiah取决于您计划如何使用该指针,但一般来说,是的。@Isiah:如果您需要将
    void*
    强制转换为其他类型,您需要知道它实际指向的类型。如果您的代码设计为该指针只有一种可能的类型,那么您可以强制转换为该类型。但是,如果有任何歧义,那么您需要第二个参数来指示类型;如果将其应用于
    void*
    表达式,则类型为
    void*
    ,而不是原来的类型(如果不是
    void*
    )。嗯……无论如何,这都会使该类型无效;如果它不能告诉你你需要知道的一件事,为什么它们会包括这一点呢?
    #定义SWAP(x,y)做{typeof(x){u tmp=(x);(x)=(y);(y)=_tmp;}而(0)
    ,例如。C中没有运行时类型信息,如果需要这些信息,必须显式地将其存储在某个地方;结构X_或Y{int其中;并集{struct X X;struct Y;};}
    是一种方法(在C11之前,union必须有一个名称)。或者,可以使用类似于的东西(严格来说,链接中的示例包含违反严格别名的情况)。@mafso因此链接中的信息不是我想要的;这些实现有一些相似之处,但仍有很大不同。另外,我还需要提供一个额外的参数,所以我想我会保持它的通用性,而不是工会+1对于联合,我会记得下次(因此我不必为强制转换生成第二个变量)
    typeof
    给出静态类型(即声明的类型);如果将其应用于
    void*
    表达式,则类型为
    void*
    ,而不是原来的类型(如果不是
    void*
    )。嗯……无论如何,这都会使该类型无效;如果它不能告诉你你需要知道的一件事,为什么它们会包括这一点呢?
    #定义SWAP(x,y)做{typeof(x){u tmp=(x);(x)=(y);(y)=_tmp;}而(0)
    ,例如。C中没有运行时类型信息,如果需要这些信息,必须显式地将其存储在某个地方;结构X_或Y{int其中;并集{struct X X;struct Y;};}
    是一种方法(在C11之前,union必须有一个名称)。或者,可以使用类似于的东西(严格来说,链接中的示例包含违反严格别名的情况)。@mafso因此链接中的信息不是我想要的;这些实现有一些相似之处,但仍有很大不同。另外,我还需要提供一个额外的参数,所以我想我会保持它的通用性,而不是工会+1但是对于联合体,我下次会记住这一点(因此我不必为强制转换生成第二个变量)