8

私はたくさんのprintfデバッグヘルパーマクロを持っていますが、タイプを指定しないのはかなりクールですが、cでマクロのオーバーロードのようなものを許可するためにできることはありますか(gcc 4.3で利用可能な場合はgcc固有にすることができます)。私は多分タイプタイプだと思いましたが、どうやらそれはうまくいきません。

マクロの例(頭のてっぺんのことを思い出せない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
4

3 に答える 3

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");                        \

  })
于 2011-04-12T10:22:18.403 に答える
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);
于 2011-04-12T10:52:04.257 に答える
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の使用法に2つの括弧が必要です。

于 2011-04-13T06:53:09.970 に答える