我们的应用程序中的旧代码包含对malloc
, realloc
和free
调用。 使用我们更新的代码,我们自己的实现被调用而不是标准的运行时实现。 示例如下所示,
#define malloc(s) OurMalloc(s) #define free(p) OurFree(p)
这适用于更新的代码,对于较新的C ++代码,我们只需实现全局的new
和delete
运算符,因此C ++解决方案更“干净”。
问题是我们现在必须包含第三方库,其中的类包含名称类似malloc
和free
,例如
class ABC { public: ... void free (char *p); };
如果类的自由方法具有相同数量的参数,则即使在类定义中,即使在调用没有类ABC
的方法时,C / C ++预处理器也只是替换ourFree
所有出现的free
。 所以上面的类定义和以下调用:
ABC abc; abc.free(p);
被替换为,
class ABC { public: ... void OurFree (char *p); }; ABC abc; abc.OurFree(p);
哪个可以编译,但当然没有链接。
如果ABC::free
具有与标准free不同的参数数量,则编译器仍会发出警告。 我们想避免它们。
一些替代解决方案是:
但即使这样,如果我们的代码需要调用第三方类的malloc或free方法,预处理器仍然会改变调用,除非我们编写所有这样的调用:
(abc::free)(p)
有没有办法告诉C / C ++预处理器定义它?
预处理器对范围和语义一无所知。 如此简短的回答 – 不,你不能这样做。
但是,您可以在库模块中使用#undef free
。 另一方面 – 如果从代码中调用方法abc.free()
,这将abc.free()
。
如何只为C而不是C ++定义那些替换:
#ifndef __cplusplus # define malloc(s) OurMalloc(s) # define free(p) OurFree(p) #endif
为什么不直接定义自己的malloc和free函数而不是使用宏。
所以,改变:
void *OutMalloc (size_t s)
至:
void *malloc (size_t s)
以同样的方式,你可以直接操作new和删除。
我想,虽然我可能错了,但在查看库之前,链接器会在目标文件中查找符号。
以上就是c/c++开发分享如何使用C宏(#define)来改变调用而不是原型相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522967.html