【发布时间】:2021-12-26 11:12:10
【问题描述】:
在许多情况下,我们将函数输入保留为 (void *) 并将其类型转换为函数内部所需的数据类型。 但是有什么方法可以识别这个函数内部传递的变量的真实数据类型吗?
void func (void * x);
这里它可以接受多种类型的参数。如何识别传递给它的是什么类型?
【问题讨论】:
在许多情况下,我们将函数输入保留为 (void *) 并将其类型转换为函数内部所需的数据类型。 但是有什么方法可以识别这个函数内部传递的变量的真实数据类型吗?
void func (void * x);
这里它可以接受多种类型的参数。如何识别传递给它的是什么类型?
【问题讨论】:
我假设您的代码是用 C 语言编写的(请澄清这一点,最好带有标签)。
不,没有办法做到这一点。 void* 是一个原始内存指针,没有关于它指向什么的信息。您可以将其转换为 ANY 类型,但它可能无效(当试图以错误的方式解释时,它很可能会包含垃圾,这会导致进一步的问题)。
除非有必要使用,否则应始终尽量避免使用void*,正因为如此 - 它可以规避代码中的所有类型检查,以及基于它构建的任何内容。
在不知道void* 的目标是什么的情况下,我只能说不,没有办法恢复类型信息。如果没有void*,您的问题可能会有解决方案。如果没有,因此您必须使用void*,仍然有一个技巧来传递一些类型信息:将void* 指针与将保存类型信息的enum 捆绑在一个结构中。这可以工作,但需要一些样板代码,并且您必须小心实施它以避免出现问题。
【讨论】: