你能从 C 中的 void * 打印值吗

标签 c pointers void

好的,我正在尝试这样做,但它不起作用,因为我没有取消引用指针...有没有办法在不为类型创建 switch 语句的情况下做到这一点?

typedef struct
{
    char *ascii_fmtstr;
    int len;
    int (*deserializer)(void *in, const char *ascii);
    int (*serializer)(const void *in, char *ascii);
} FORMAT;

const FORMAT formats[]=
{
    {"%d\n",    2/2}        //Int
    ,{"%s\n",   STRSIZE/2}  //String
    ,{"%.4f\n", 4/2}        //Float
    ,{"%lld",   4/2}        //Long-Long
    ,{"%s\n",   STRSIZE/2}  //Time
};

typedef struct {
    int fmtindex;
    void * vp;
} JUNK;

float f = 5.0f;
int i=1;
char foo[]="bar";

JUNK j[] = {
     {2, &f}
     ,{0, &i}
     ,{1, foo}};

void dump(void)
{
    int i;
    for(i=0;i<2;i++)
        printf(formats[j[i].fmtindex].ascii_fmtstr, j[i].vp);

}

最佳答案

看起来你正在使用 void * 作为廉价的 union。这是一个非常糟糕的主意。我认为您会发现 unionenumswitch 结合使用可以使这个看起来更加整洁,在 C 中。您会在 #ifdef SWITCH ... #else 中找到 switch,在 中找到无开关版本>#else ... #endif

#include <stdio.h>

struct object {
    enum type {
        d=0,
        s=1,
        f=2,
        lld=3,
        time=4
    } type;

    union instance {
        int d;
        char *s;
        float f;
        long long lld;
        char *time;
    } instance;
};

#ifdef SWITCH
void print_object(struct object *o) {
    switch (o->type) {
        case d: printf("%d", o->instance.d); break;
        case s: printf("%s", o->instance.s); break;
        case f: printf("%f", o->instance.f); break;
        case lld: printf("%lld", o->instance.lld); break;
        case time: printf("%s", o->instance.time); break;
    };
}
#else
void print_d(struct object *o);
void print_s(struct object *o);
void print_f(struct object *o);
void print_lld(struct object *o);
void print_time(struct object *o);

void print_object(struct object *o) {
    void (*print_functions[])(struct object *) = {
         [d] = print_d,
         [s] = print_s,
         [f] = print_f,
         [lld] = print_lld,
         [time] = print_time
    };

    print_functions[o->type](o);
}

void print_d(struct object *o) { printf("%d", o->instance.d); }
void print_s(struct object *o) { printf("%s", o->instance.s); }
void print_f(struct object *o) { printf("%f", o->instance.f); }
void print_lld(struct object *o) { printf("%lld", o->instance.lld); }
void print_time(struct object *o) { printf("%s", o->instance.time); }
#endif

int main(void) {
    struct object o = { .type = d,                /* type: int */
                        .instance = { .d = 42 }   /* value: 42 */ };

    print_object(&o);
    return 0;
}

关于你能从 C 中的 void * 打印值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16229417/

相关文章:

c - 用指针打印 abc

c - 指针运算

c++ - 空指针初始化?如果不是,那是什么?

c - 什么是 "better": (x=x) or (void(x)) for unused parameters?

unix - 查找给定范围内毕达哥拉斯三元组的数量

c - 如何将这个 "normal"数组变成指针数组?

c - 我想要一个读取文件并返回 ascii 值之和的函数

c - 带有 void 数组指针参数的函数如何知道数组元素的大小?

c - realloc 和 memcpy 如何工作?

c++ - 版本控制可执行文件并在运行时修改它