我的函数宏有以下问题。这一直有效,直到我添加了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) {...}
答案 0 :(得分:8)
您对宏及其要扩展的功能使用相同的名称。
答案 1 :(得分: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
}