Передача и использование переменного числа аргументов для функции в C - PullRequest
4 голосов
/ 01 сентября 2010

Я не понимаю, почему это не распечатывает "это тест 42", как я ожидаю?

  1 #include <stdio.h>
  2 #include <stdarg.h>
  3 
  4 #define ME(x)   blah x
  5 
  6 void blah(const char *fmt, ...)
  7 {
  8         va_list arg;
  9 
 10         va_start(arg, fmt);
 11         printf(fmt, arg);
 12         va_end(arg);
 13 }
 14 
 15 int main()
 16 {
 17         ME(("this is a test %d\n", 42));
 18 
 19         return 0;
 20 }

Вместо этого это примерно так:

$ gcc blah.c
$ ./a.out
this is a test 1606416656 

Ответы [ 2 ]

8 голосов
/ 01 сентября 2010

Вы хотите вызвать vprintf () вместо printf ().

3 голосов
/ 01 сентября 2010

Вы должны использовать va_arg, чтобы получить фактическое значение аргумента. Va_start является только инициализацией переменной arg. Arg на самом деле является указателем на значение в стеке, а не сам по себе.

Следующая строка возвращает фактическое значение:

int myvalue = va_arg(arg,int);

Обратите внимание, что я получаю целое число, а не короткое, поскольку короткие автоматически переводятся в int компилятором C.

РЕДАКТИРОВАТЬ: Uli ответ также является правильным. Если вы хотите передать несколько значений в printf, вы должны вызвать vprintf вместо printf (и тогда вызывать va_arg не нужно, поскольку в этом случае вы не знаете точные типы аргументов).

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