Создание прокси-функции для fprintf ненавязчивым способом? - PullRequest
1 голос
/ 03 июня 2011

Я бы хотел создать прокси для fprintf, вот так:

void raise_exception(char *filename, int line, char *format_string, ...) {
    fprintf(stderr, "Exception in `%s`:%d!\n", filename, line);
    fprintf(stderr, format_string, ...);
    exit(EXIT_FAILURE);
}

Но что мне поставить вместо второго многоточия?Это вообще возможно?

Я хотел бы упростить это даже немного больше так:

#define RAISE(...) raise_exception(__FILE__, __LINE__, ...)

Но я не думаю, что это сработаетлибо.

Есть идеи?Спасибо!

ОБНОВЛЕНИЕ

Прямо из Википедия :

Макросы с переменным аргументом были введены в ISO / IEC 9899: 1999 (C99)

Таким образом, определение, которое будет делать это, должно выглядеть так:

#define RAISE(...) raise_exception(__FILE__, __LINE__, __VA_ARGS__)

Ответы [ 3 ]

4 голосов
/ 03 июня 2011
#include <stdarg.h>
void raise_exception(char *filename, int line, char *format_string, ...)
{
    va_list args;
    fprintf(stderr, "Exception in `%s`:%d!\n", filename, line);
    va_start(args, format_string);
    vfprintf(stderr, format_string, args);
    va_end(args);
    exit(EXIT_FAILURE);
}
1 голос
/ 03 июня 2011

Пожалуйста, посмотрите этот вопрос:

Передача переменного числа аргументов вокруг

Ваш точный пример - обертка printf - используется в качестве примера в обсужденииздесь:

http://www.swig.org/Doc1.3/Varargs.html

1 голос
/ 03 июня 2011

Вместо этого используйте vfprintf.

...