Помогите с моей функцией printf - PullRequest
3 голосов
/ 25 мая 2010

Для целей отладки я хотел бы иметь функцию printf_debug, которая функционировала бы так же, как стандартная функция printf, но печатала бы, только если #DEFINE DEBUG был равен true

Я знаю, что должен использовать varagrs (...), но я понятия не имею, как этого добиться.

Заранее спасибо.

Ответы [ 5 ]

9 голосов
/ 25 мая 2010

Легче просто # определить это прочь. Примерно так:

#ifdef DEBUG
#define printf_debug printf
#else
#define printf_debug while(0)printf
#endif
2 голосов
/ 25 мая 2010

Вам не нужно использовать vargs, макросы будут работать. Вот пример, который будет печатать функцию и номер строки:

#ifdef DEBUG
#define printf_debug(fmt, args...) printf("%s[%d]: "fmt, __FUNCTION__, __LINE__, ##args)
#else
#define printf_debug(fmt, args...)
#endif

Аргументы ## здесь будут заменены списком аргументов, которому нравится то, что делает vargs при вызове функции.

2 голосов
/ 25 мая 2010

Я не знаю, чего именно вы хотите достичь. Если вы хотите, чтобы блок кода выполнялся, только если определено DEBUG, используйте директиву препроцессора #ifdef.

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

void printf_debug(const char *format, ...) {
  #ifdef DEBUG
  va_list args;
  va_start(args, format);
  vprintf(format, args);
  va_end(args);
  #endif /* DEBUG */
}
0 голосов
/ 25 мая 2010

C99 только компилятор!

#include <stdio.h>

#define DEBUG

#ifdef DEBUG
 #define debug(...) printf(__VA_ARGS__)
#else
 #define debug while(0)
#endif

int main(int argc, char *argv[])
{
    debug("Only shows when DEBUG is defined!\n");
    return 0;
}

Если честно, макросы varidic не нужны, вы можете просто написать это так:

#include <stdio.h>

#define DEBUG

#ifdef DEBUG
 #define debug printf
#else
 #define debug while(0)
#endif

int main(int argc, char *argv[])
{
    debug("Only shows when DEBUG is defined!\n");
    return 0;
}

Подумав об этом, отладочная информация должна идти в stderr, чтобы не мешать stdout, поэтому следует отдать предпочтение этому:

#include <stdio.h>

#define DEBUG

#ifdef DEBUG
 #define debug(...) fprintf(stderr, __VA_ARGS__)
#else
 #define debug while(0)
#endif

int main(int argc, char *argv[])
{
    debug("Only shows when DEBUG is defined!\n");
    return 0;
}
0 голосов
/ 25 мая 2010

Вы должны использовать макросы va_arg, они используются для доступа к переменным переменным. Полезная ссылка: http://www.cppreference.com/wiki/c/other/va_arg. Ссылка на C ++, но эти макросы можно использовать и в C.

В вашей фактической реализации вы размещаете код с использованием переменных переменных в блоке #ifdef.

Но если вы ищете обычный вызов printf, в зависимости от DEBUG подойдет простой #define, действующий как псевдоним.

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