0

関数のマクロで次の問題が発生しています。これは、print_heavyhitters関数を追加するまで機能していました。私はこれをm61.hに持っています:

#if !M61_DISABLE
#define malloc(sz)      m61_malloc((sz), __FILE__, __LINE__)
#define free(ptr)       m61_free((ptr), __FILE__, __LINE__)
#define realloc(ptr, sz)    m61_realloc((ptr), (sz), __FILE__, __LINE__)
#define calloc(nmemb, sz)   m61_calloc((nmemb), (sz), __FILE__, __LINE__)
#define print_heavyhitters(sz)  print_heavyhitters((sz), __FILE__, __LINE__)
#endif

m61.cでは、print_heavyhitters(sz)を除いて、これらの関数はすべて問題ありません。「-関数print_heavyhittersのマクロ使用エラー:

- Macro usage error for macro: 
 print_heavyhitters
- Syntax error

m61.c:

#include "m61.h"
...

void *m61_malloc(size_t sz, const char *file, int line) {...}

void print_heavyhitters(size_t sz, const char *file, int line) {...}
4

2 に答える 2

8

マクロと拡張先の関数に同じ名前を使用します。

于 2012-10-03T14:57:22.583 に答える
2

マクロと関数名に同じ名前を使用することは、プリプロセッサが再帰的に展開されないため、プリプロセッサに関する限り問題ありませんが、このような混乱を招くエラーにつながる可能性があります。適切な場所に注意すればこれを行うことができますが#undef、混乱を避けるために別の記号名を使用することをお勧めします。

私はこのようなことをします:

// Header file
#if !M61_DISABLE
...
#define print_heavyhitters(sz)  m61_print_heavyhitters((sz), __FILE__, __LINE__)
#endif

// Source file
#include "m61.h"

#if !M61_DISABLE
#undef print_heavyhitters
#endif

void print_heavyhitters(size_t sz)
{
    // Normal implementation
}

void m61_print_heavyhitters(size_t sz, const char *file, int line)
{
    // Debug implementation
}
于 2012-10-03T15:08:30.990 に答える