我有一堆printf调试助手宏,如果不指定类型那将是非常酷的,你可以做些什么来允许像c中的宏重载一样(如果它在gcc中可用,可以是gcc特定的4.3)。我认为可能有类型,但显然不起作用。
示例宏(我也有一些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
答案 0 :(得分:9)
试试这个;它使用gcc的__builtin方法,并尽可能自动地为您确定类型,并为您提供一个简单的DEBUG宏,您无需指定类型。当然,您可以将typeof(x)与float等进行比较等。
#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 :(得分:1)
下面的宏怎么样?它仍然需要您选择打印格式,但您不必重新定义所有可能的情况,它也适用于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);
答案 2 :(得分:0)
我认为您可以尝试使用以下代码:
#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的使用在这里采用双括号。