【问题标题】:C macro redefined重新定义 C 宏
【发布时间】:2014-09-13 18:00:18
【问题描述】:

我想用 myfree2() 替换名为 myfree() 的 free() 周围的包装函数的所有实例。不幸的是,我无法让它工作,因为第二个宏重新定义了第一个。如果第二个宏没有参数,为什么要重新定义第一个宏?

// I must delete this function or the macro will replace it as well and cause a syntax error!
void myfree(void *p)
{
    if(p != NULL)
    free(p);
}

void myfree2(void *p)
{
    if(p != NULL)
    free(p);
}

#define myfree(p) do { myfree2(p); p = (void *)0xdeadbeef; } while (0);
#define myfree myfree2

myfree(p); // Wrapper around free().

afunc(arg, myfree); // Wrapper is used as a function argument!

【问题讨论】:

  • #define myfree(p) do { myfree2(p); p = (void *)0xdeadbeef; } while (0) remove 分号或 funky do-while 没有意义。 PLUS:if(p != NULL) free(p); 允许使用 NULL 参数调用 free。
  • 请避免使用宏。它们是为了生活中的基本东西。其他任何你都躲在地狱里的东西
  • @EdHeal 我同意,但我认为在这种情况下这是非常值得的。

标签: c gcc macros


【解决方案1】:

C 预处理器不允许基于参数数量重载宏——您只能拥有一个给定名称的宏。您可以通过在 myfree 的声明中使用多余的括号来解决这个问题:

#define myfree(p) do { myfree(p); p = (void *)0xdeadbeef; } while (0)

void (myfree)(void *p)
{
    if(p != NULL)
    free(p);
}

myfree(p); // Wrapper around free().

afunc(arg, myfree); // Wrapper is used as a function argument!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2019-08-05
    • 2021-07-26
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多