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 回答