переменные аргументы типа данных в функциях с переменным числом аргументов - PullRequest
2 голосов
/ 04 октября 2010

Можем ли мы передавать аргументы разных типов данных в одну и ту же переменную функцию одновременно?

Ответы [ 4 ]

3 голосов
/ 04 октября 2010

конечно, посмотрите на обычное использование printf:

printf("Error %d: %s", errNum, errTxt);
2 голосов
/ 04 октября 2010
so ross$ expand < variadic.c && cc -Wall -Wextra variadic.c 
#include <stdio.h>
#include <stdarg.h>

void f(int, ...);
struct x { int a, b; } y = { 5, 6 };

int main(void) {
  float q = 9.4;
  f(0, 1.234, &q, "how now", 123, &y);
  return 0;
}

void f(int nothing, ...) {
  va_list ap;

  va_start(ap, nothing);
  double f = va_arg(ap, double);
  float *f2 = va_arg(ap, float *);
  char  *s   = va_arg(ap, char *);
  int    i    = va_arg(ap, int);
  struct x *sx = va_arg(ap, struct x *);
  va_end(ap);

  printf("%5.3f %3.1f %s %d %d/%d\n", f, *f2, s, i, sx->a, sx->b);
}
so ross$ ./a.out
1.234 9.4 how now 123 5/6
0 голосов
/ 04 октября 2010

Я сделал функцию для распаковки двоичных данных, используя функцию varadic, она принимает разные типы в зависимости от того, что вы хотите «закодировать / декодировать».

Вы бы использовали это как:

uint32_t a;
uint16_t b;
uint16_t c;
uint8_t *buf = ....;

depickle(buf,"sis",&a,&b,&c);

где 's' ожидает uint16_t * и декодирует 2 байта из buf в a как младший порядок байтов, 'i' говорит, чтобы декодировать 4 байта как младший порядок байтов в 'b'

Илинапример, декодировать 4 байта как старшие порядковые номера в uint32_t:

uint32_t a;
uint8_t buf[] = {0x12,0x34,0x56,0x78};
depickle(buf,"I",&a);

Существует ранняя версия около здесь .

0 голосов
/ 04 октября 2010

Вот пример без печати (старая версия: http://codepad.org/vnjFj7Uh)

#include <stdarg.h>
#include <stdio.h>

/* return the maximum of n values. if n < 1 returns 0 */
/* lying to the compiler is not supported in this version, eg:         **
**    va_max(4, 8, 8, 8, 8, 8, 8, 8, 8)                                **
** or                                                                  **
**    va_max(4, 2, 2)                                                  **
/* is a bad way to call the function (and invokes Undefined Behaviour) */
int va_max(int n, ...) {
  int res;
  va_list arg;

  if (n < 1) return 0;

  va_start(arg, n);
  n--;
  res = va_arg(arg, int);
  while (n--) {
    int cur = va_arg(arg, int);
    if (cur > res) res = cur;
  }
  return res;
}

int main(void) {
  int test6 = va_max(6, 1, 2, 3, 4, 5, 6);
  int test3 = va_max(3, 56, 34, 12);
  if (test6 == 6) puts("6");
  if (test3 == 56) puts("56");
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...