【发布时间】:2015-03-09 02:03:47
【问题描述】:
基本问题:是否有一种可移植的(或者至少是大多数编译器中都有的库)方法来在运行时查询 void* 指针的类型?特别是,是否可以确定指针是 struct x 类型还是 struct y 类型(例如)。
附加信息:我知道 gcc 提供 typeof 运算符,但我想要一种更便携、更少依赖编译器的方式来完成同样的事情。
要求:
不能完全依赖于编译器。这包括特定于编译器的宏和其他大多数编译器通常不实现的功能。
我更喜欢适用于任何编译器的函数,而不是任何可移植性较差的实现(尽管我会接受最适合我目标的答案)。
建议在库中使用不在 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