好的,所以我正在编写一个日志服务,将一些数据写入某个文件(假设该文件的名称是 log )。
我想写的数据类型各不相同,可能是int或string或其他。
到目前为止,我的功能看起来如此:
write_log(fp, "Memory size :", mem_size);
我调用该函数的方式可能因我的数据而异:
write_log(fp, "Username :", username);
或者
va_arg(list, type_of_var)
我不知道第三个参数是字符串还是int或其他东西。
我本可以使用{{1}},但由于我的数据类型随意变化,我无法使用它。
任何想法如何在不知道它的类型的情况下如何访问函数的第三个参数?
答案 0 :(得分:4)
没有可移植的标准方法来了解类型。
首先想到的解决方案是使用已知的C惯用法来传递格式字符串(例如public class B extends A {
public void doStuff() {
super.doSomethingElse();
}
}
public class A {
// doesn't actually retry
@Retryable
public void doSomething() {
throws new Exception();
}
}
,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
如果您可以访问C11的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
}
}
功能,就像大多数现代编译器一样,您可以拥有类似的东西:
_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)
将选择适当的功能。