c - 声明 void 指针以将类型处理推向下游

标签 c pointers void

执行以下操作是否很常见:

void *x = (void *) "one";
void *y = (void *) 2;
void *z = (void *) NULL;

而不是:

char * x = "one";
int y = 2;

我问这个问题的原因是能够调用可以接受多种类型的函数。例如,在 javascript 中可以使用各种元素的连接。在某种程度上,使用 (void *) 似乎只是表示“任何类型”的简单方法。

最佳答案

不,因为你不能取消引用 void 指针:你必须知道存储的是什么类型,这使得这个想法毫无用处。

您可能正在寻找的是 variant type .

enum type {
    CHAR, INT, DOUBLE, STR
};

typedef struct {
    union {
        char   c;
        int    i;
        double d;
        char   *str;
    };
    enum type t;
} variant;

void displayGenericObjec(variant v)
{
    switch (v.t) {
        case CHAR:
            putchar(v.c);
            break;
        case INT:
            printf("%d", v.i);
            break;
        case DOUBLE:
            printf("%f", v.d);
            break;
        case STR:
            printf("%s", v.str);
            break;
    }
}

variant x;
x.t = INT;
x.i = 42;
displayGenericObject(x);

这不是一个非常实用的解决方案,但它适用于只需要几种类型的简单代码。

关于c - 声明 void 指针以将类型处理推向下游,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177882/

相关文章:

c - 正在重新分配的指针未分配

c - 是否可以保留指向局部变量超出该变量范围的指针?

c++ - 创建一个空的 istream 以通过方法调用填充

c++ - 将 void 指针分配给另一个 void 指针

c++ - C/C++ - (void) 如何不用作参数?

c - printf ("%p") 并转换为 (void *)

c - 如何在 C(Linux utf8 终端)中打印 "box drawers"Unicode 字符?

java - 何时以及如何正确使用循环优化和转换技术

c# - 如何找出记录数最大的数组编号?

c - 为什么我无法访问存储在另一个函数中的值?