gpt4 book ai didi

c++ - 如何使用 C 宏 (#define) 来改变调用而不是原型(prototype)

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:32 25 4
gpt4 key购买 nike

我们应用程序中的旧代码包含对 mallocreallocfree 的调用。使用我们更新的代码,调用我们自己的实现而不是标准的运行时实现。示例如下所示,

#define malloc(s) OurMalloc(s)
#define free(p) OurFree(p)

这对于更新的代码和较新的 C++ 代码都适用,我们只需实现全局 newdelete 运算符,因此 C++ 解决方案“更干净”。

问题是我们现在必须包含一个第 3 方库,它的类包含名称为 mallocfree 的方法,例如

   class ABC
{
public:
...
void free (char *p);
};

如果类的 free 方法具有相同数量的参数,C/C++ 预处理器简单地将所有出现的 free 替换为 ourFree,即使在类定义中也是如此,即使在调用 ABC 类的方法时也是如此。所以上面的类定义和下面的调用:

ABC abc;
abc.free(p);

替换为,

class ABC
{
public:
...
void OurFree (char *p);
};

ABC abc;
abc.OurFree(p);

哪个可以编译,但当然不能链接。

如果 ABC::free 的参数数量与标准 free 不同,编译器仍会给出警告。我们想避免它们。

一些替代解决方案是:

  • 在第 3 方包含文件的开头取消定义我们的定义,稍后重新定义
  • 确保第 3 方包含文件始终包含在我们自己的定义之前

但即便如此,如果我们的代码需要调用第 3 方类的这些 malloc 或 free 方法,预处理器仍将更改调用,除非我们像这样编写所有调用:

(abc::free)(p)

有没有办法告诉 C/C++ 预处理器定义它?

  • 只能替换纯 C 调用
  • 原型(prototype)不得被替换
  • 不得替换类中的方法

最佳答案

如何只定义 C 而不是 C++ 的替换:

#ifndef __cplusplus
# define malloc(s) OurMalloc(s)
# define free(p) OurFree(p)
#endif

关于c++ - 如何使用 C 宏 (#define) 来改变调用而不是原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319381/

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