【问题标题】:Is there a portable way to query the type of void* pointer?是否有一种可移植的方式来查询 void* 指针的类型?
【发布时间】:2015-03-09 02:03:47
【问题描述】:

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

附加信息:我知道 gcc 提供 typeof 运算符,但我想要一种更便携、更少依赖编译器的方式来完成同样的事情。

要求

  1. 不能完全依赖于编译器。这包括特定于编译器的宏和其他大多数编译器通常不实现的功能。

  2. 我更喜欢适用于任何编译器的函数,而不是任何可移植性较差的实现(尽管我会接受最适合我目标的答案)。

  3. 建议在库中使用不在 C11 函数中但在大多数编译器中常见的函数是可以的。请务必解释它的工作原理和论点。

【问题讨论】:

  • typeof 给出静态类型(即声明的类型);如果将其应用于void * 表达式,则类型为void *,而不是原来的类型(如果不是void *)。
  • 嗯……好吧,那无论如何都会使那毫无用处;如果它不能告诉你你需要知道的一件事,为什么还要包括它?
  • #define SWAP(x, y) do { typeof(x) _tmp = (x); (x) = (y); (y) = _tmp; } while(0),例如。 C 中没有运行时类型信息,如果您需要该信息,则必须将其显式存储在某处。
  • enum { IS_X, IS_Y }; struct X_or_Y { int which; union { struct X x; struct Y y; }; }; 之类的方法可以做到这一点(在 C11 之前,联合必须有一个名称)。或者,可以使用类似于 this 的东西(严格来说,链接中的示例包含违反严格别名的行为)。
  • @mafso 链接中的信息不是我要找的;这些实现有一些相似之处,但仍然有很大不同。另外,我仍然需要提供一个额外的论点,所以我认为我会保持它的通用性而不是联合。不过为联合 +1,下次我会记得的(所以我不必为演员制作第二个变量)

标签: c type-conversion void-pointers


【解决方案1】:

你要求的是不可能的。 void * 指针根据定义是一个通用指针。它可以转换为任何类型的指针或从任何类型的指针转​​换;无法确定它指向什么类型的数据(如果有的话!)。

【讨论】:

  • 如果我尝试访问一个不存在的字段或转换为错误的类型会不会有问题?
  • 那么根据定义,唯一可移植、不易出错的方法是让函数采用另一个参数来指定 void* 指针的类型?
  • @Isaiah 取决于你打算用那个指针做什么,但总的来说,是的。
  • @Isiah:如果您需要将void* 转换为其他内容,您需要知道它实际指向的类型。如果您设计的代码使得该指针只有一种可能的类型,那么您可以强制转换为该类型。但是,如果有任何歧义,则需要第二个参数来指示类型。
  • 一看到impossible+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2011-03-24
  • 2015-09-19
  • 2022-01-03
相关资源
最近更新 更多