如何在不知道C中的类型[变量参数]的情况下访问特定参数?

好的,所以我正在编写一个日志服务,将一些数据写入某个文件(假设该文件的名称是log).

我想写的数据类型各不相同,可能是int或string或其他东西.

到目前为止,这是我的功能看起来如何:

void write_log(FILE * fp, char * event, ...)
{
    va_list list;
    va_start(list, event);
    // Cannot use va_arg(list, type_of_var) here!!!
}

我调用函数的方式可能因我的数据而异:

write_log(fp, "Memory size :", mem_size);

要么

write_log(fp, "Username :", username);

我不知道第三个参数是一个字符串,还是一个int或其他东西.

我本可以使用va_arg(list,type_of_var),但由于我的数据类型随意变化,我无法使用它.

知道如何在不知道它的类型的情况下访问函数的第三个参数?

最佳答案
没有便携式标准方法来了解类型.

想到的第一个解决方案是使用已经众所周知的C语言来传递格式字符串(例如printf,scanf).

void write_log(FILE * fp, char * event, const char* fmt, ...)
{
    va_list list;
    va_start(list, event);

    // process fmt and act accordingly
}

如果它只是一个额外的参数,那么你可以传递一个枚举:

enum type {
   integer,
   pointer,
   floating
};

void write_log(FILE * fp, char * event, enum type t, ...)
{
    switch(t)
    {
    case integer: // do stuff with integer
    case pointer: // do stuff with pointer
    }
}

如果您可以访问C11的_Generic功能,就像大多数现代编译器一样,您可以拥有类似的东西:

void write_logi(FILE * fp, char * event, int);
void write_logf(FILE * fp, char * event, float);
void write_logfoo(FILE * fp, char * event, struct foo);

#define write_log(file, event, arg) _Generic((arg), \
    int: write_logi,                                \
    float: write_logf,                              \
    struct foo: write_logfoo                        \
)(file, event, arg)

然后你可以打电话给:

write_log(fp, event, i/*int*/);
write_log(fp, event, f/*float*/);

并选择适当的功能.

转载注明原文:如何在不知道C中的类型[变量参数]的情况下访问特定参数? - 代码日志