如何在C中返回任何类型的值



我需要从C代码中使用变量获得一些日志;

例如,来自以下代码:

int main(){
int a,b,c;
a=1;
b=1;
c= a==0||b==1
return 0;
}

我做:

int log(int v){
//print log
return v;
}
int main(){
int a,b,c;
a=1;
b=1;
c= log(a)==0||log(b)==1
return 0;
}

这是完美的,但所有变量都是内部的。

如何对任何类型的变量执行此操作?

#include <stdio.h>
#define LOG(TYPE, STRING, VAR) 
(printf(STRING, VAR), (TYPE) VAR)
int main()
{
int j = 3;
double q = 2.3;
double s;
s = LOG(int, "j=%dn", j) + LOG(double, "q=%lfn", q);
LOG(double, "s=%lfn", s);
}

j=3
q=2300000
s=5300000

注意:这会对VAR表达式求值两次,因此它应该始终是正则变量的内容,而不是更复杂的表达式。您可以将对printf的调用替换为对使用varargs的日志记录操作的调用。

Log4c是您的朋友:

Log4c是一个C库,用于灵活地记录文件、系统日志和其他目的地。它是以Log for Java库为模型的(http://jakarta.apache.org/log4j/),尽可能地接近其API。下面是Log4j的简短介绍,其中描述了API和设计原理。

如何对任何类型的变量执行此操作?

要根据各种类型切换代码,请使用_Generic()选择特定类型的函数。

int log_int(int v) {
printf("(int %d)n", v);
return !!v;
}
int log_double(double v) {
printf("(double %e)n", v);
return !!v;
}
int log_char_ptr(char *v) {
printf("(str %s)n", v);
return !!v;
}
#define mylog(X) _Generic((X), 
int: log_int, 
double: log_double, 
char *: log_char_ptr 
)(X)

现在代码只需要调用mylog(various_types)

int main(void) {
int i = 3;
double d = 4.0;
char *s = "5";
mylog(i)==0||mylog(d)==0||mylog(s)==0;
return 0;
}

输出

(int 3)
(double 4.000000e+00)
(str 5)

最新更新