Как я могу вернуть значения любого типа в C? - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно получить некоторые журналы от использования переменных в коде 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 голосов
/ 05 декабря 2018
#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.

0 голосов
/ 05 декабря 2018

как я могу сделать это для переменной любого типа?

Чтобы переключать код на основе различных типов, используйте _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)
0 голосов
/ 05 декабря 2018

Log4c - ваш друг:

Log4c - это библиотека C для гибкой регистрации файлов, системного журнала и других мест назначения.Он смоделирован после библиотеки Log for Java (http://jakarta.apache.org/log4j/),, оставаясь настолько близким к их API, насколько это разумно. Вот краткое введение в Log4j, которое описывает API и обоснование разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...