LINUX.ORG.RU

Отладочные макросы.


0

0

Нужно сделать что-то типа того, что ниже, но только чтобы аргумент макроса пинимал любой набор символов в скобках (в том числе запятые) как один параметр. Можно такое сотворить?

#define p(x) printf(x);

#include <stdio.h>

void main () { p("debug: %d", 3); return; }

Нужно это соответственно чтобы в релизе сделать пустое определение p(x).

★★★★

это-ж классика ;-)
#ifdef DEBUG
extern void debug_printf(const char *,unsigned int,const char *,...)
#define MSG(m,...) debug_printf(__FILE__,__LINE__,m,##__VA_ARGS__)
#else 
#define MSG(m,...) {}
#endif

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. Я знаю что классика, но сходу не нашел :)

alexru ★★★★
() автор топика

кхм.. классика - это:

#ifdef DEBUG
#define DPRINTF(msg) printf msg
#else
#define DPRINTF(msg)
#endif

...
DPRINTF(("verison is %d%c", 10, 'c'));

вся радость в волшебных пузырьках aka двойных скобках при вызове DPRINTF.

ps: vararg для препроцессора - это конечно замечательно, но далеко не все компиляторы C это поддерживают включая старо-средние версии gcc. afair появилось в стандарте c99?.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Будет 2 классики... для новых и старых компиляторов. Правда второй вариант мне больше нравится, почему-то... :)

alexru ★★★★
() автор топика
Ответ на: комментарий от klalafuda

Выдрал из текущего проекта 

#define PARSER_ASSERT (x,y) { if (! x) cerr<<"Assertion! "<<#y<<" file:"<<__FILE__<<" line:"<<__LINE__<<" code:"<<#x<<endl; } 

юзать так 

PARSER_ASSERT(sonething.allrigth(), "Чорт! Нечто = "<<something.content())

GameMagister
()
Ответ на: комментарий от alexru

Может показаться полезной идея перенаправить отладочные 
сообщения в отдельный fd:

#ifndef NDEBUG
FILE *debug;
#endif

void D(const char *fmt, ...)
{
#ifndef NDEBUG
   va_list ap;
   
   va_start(ap, fmt);
   vfprintf(debug, fmt, ap);
   va_end(ap);
#endif
}

...

void main()
{
#ifndef NDEBUG
    debug = popen("awk '{ print \"debug: \" $0 }' 1>&2", "w");
#endif
    ...
    D("debug print\n");
    ...
#ifndef NDEBUG
    fclose(debug);
#endif
}

myhand
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.