Тип перегрузки макроса
У меня есть несколько макросов printf debug helper, и было бы неплохо не указывать тип, есть ли что-нибудь, что можно сделать, чтобы разрешить что-то вроде перегрузки макросов в 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 ответа
Попробуй это; он использует методы 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"); \
})
Как насчет следующего макроса? Это все еще требует, чтобы вы выбрали формат печати, но вам не придется переопределять все возможные случаи, и это также работает на 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);
Я думаю, что вы можете попробовать с помощью следующего кода:
#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 требует двойных скобок.