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

时间:2018-12-05 00:05:30

标签: c void-pointers

我需要从使用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;
}

这很完美,但是所有变量都为int。

我该如何处理任何类型的变量?

3 个答案:

答案 0 :(得分:1)

#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=%d\n", j) + LOG(double, "q=%lf\n", q);
    LOG(double, "s=%lf\n", s);
}
  

j = 3
  q = 2.300000
  s = 5.300000

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

答案 1 :(得分:0)

Log4c是你的朋友:

  

Log4c是一个C语言库,用于灵活地记录文件,系统日志和其他目标。它是根据Log for Java库(http://jakarta.apache.org/log4j/)建模的,在合理范围内尽可能接近其API。这是Log4j的简短介绍,介绍了API和设计原理。

答案 2 :(得分:0)

  

我该如何处理任何类型的变量?

要根据各种类型切换代码,请使用_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)