gpt4 book ai didi

重新定义 C 宏

转载 作者:行者123 更新时间:2023-11-30 17:29:02 24 4
gpt4 key购买 nike

我想用 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!

最佳答案

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!

关于重新定义 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25826063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com