Тип перегрузки макроса - PullRequest
7 голосов
/ 12 апреля 2011

У меня есть куча макросов помощника отладки printf, и было бы неплохо не указывать тип, есть ли что-нибудь, что вы можете сделать, чтобы разрешить что-то вроде перегрузки макросов в c (может быть специфично для gcc, если он доступен в gcc 4,3). Я подумал, может быть, typeof, но, видимо, это не работает.

пример макроса (у меня также есть кое-какие терминальные цвета ascii, которые я не могу вспомнить из макушки головы)

#ifdef _DEBUG
#define DPRINT_INT(x) printf("int %s is equal to %i at line %i",#x,x,__LINE__);
.
.
.
#else
#define DPRINT_INT(x)
.
.
.
#endif

Ответы [ 3 ]

9 голосов
/ 12 апреля 2011

Попробуйте это;он использует методы gcc __builtin и автоматически определяет тип для вас, насколько это возможно, и создает простой макрос DEBUG, в котором вам не нужно указывать тип.Конечно, вы можете сравнить typeof (x) с плавающей точкой и т. Д. И т. Д.

#define DEBUG(x)                                                 \
  ({                                                             \
    if (__builtin_types_compatible_p (typeof (x), int))          \
        fprintf(stderr,"%d\n",x);                                \
    else if (__builtin_types_compatible_p (typeof (x), char))    \
        fprintf(stderr,"%c\n",x);                                \
    else if (__builtin_types_compatible_p (typeof (x), char[]))  \
        fprintf(stderr,"%s\n",x);                                \
    else                                                         \
        fprintf(stderr,"unknown type\n");                        \

  })
1 голос
/ 12 апреля 2011

Как насчет следующего макроса?Он по-прежнему требует, чтобы вы выбрали формат печати, но вам не придется переопределять все возможные случаи, и он также работает на MSVC:

#define DPRINT(t,v) printf("The variable '%s' is equal to '%" ## #t ## "' on line %d.\n",#v,v, __LINE__)

Чтобы использовать его:

int var = 5;
const char *str = "test";
DPRINT(i,var);
DPRINT(s,str);
0 голосов
/ 13 апреля 2011

Я думаю, вы можете попробовать следующий код:

#define DPRINT(fmt) do{ \
            my_printf fmt ; \
        } while(0)

my_printf( const char* szFormat, ... )
{
    char szDbgText[100];

    va_start(args, szFormat);
    vsnprintf(&szDbgText,99,szFormat,args);
    va_end(args);

    fprintf( stderr, "%s", szDbgText );
}
// usage
func( )
{
    int a = 5;
    char *ptr = "hello";

    DPRINT( ("a = %d, ptr = %s\n", a, ptr) );
}

Примечание. При использовании DPRINT здесь используются двойные скобки.

...