首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C++ -重写默认函数

C/C++ -重写默认函数
EN

Stack Overflow用户
提问于 2010-09-27 20:18:26
回答 4查看 4.1K关注 0票数 4

我有以下问题:

Microsoft (我使用的是2008年的SP1)是否提供了覆盖standart C函数的任何方法,如mallocmemcpy

假设我有一个外部构建的库,它包含malloc.objmemcpy.obj__。图书馆名为library.lib__。

如何构建我的项目,使编译器使用我的(覆盖)版本的malloc()memcpy()例程,而不是那些提供的(我假设它们共享相同的语法)

整件事情的重点是改变我的项目中的每一个malloc,而不是像my_malloc或similiar这样的名称别名,这样我就可以比较性能。

,这有可能吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-27 20:32:57

尚未尝试此操作,但-在项目属性->链接器->输入中,将“忽略所有默认库”设置为“是”。然后设置‘附加依赖项’= library.lib;libcmt.lib。

这应该包括您的库在标准静态CRT之前。如果功能链接是相同的,在每一个,这应该是做你想要的。不过,在两个静态库中如何将malloc/free链接到操作系统可能会有问题。我猜想library.lib也重新定义了realloc/free/calloc等等?

票数 2
EN

Stack Overflow用户

发布于 2010-09-27 20:34:23

是否可以更改构建和链接过程,以便替换memcpymalloc的实现?是。是个好主意吗?不怎么有意思。

最好只使用#define逻辑将这些函数重命名为memcpy_testingmalloc_testing,然后有一个在两者之间切换的#define。这样,您的解决方案就更适合于其他构建系统,而且对其他程序员来说也更清楚您到底在做什么。

编辑:为了与注释保持一致,下面是您将在共享头文件中所做的工作的示例:

代码语言:javascript
复制
#ifdef testing
#    define my_malloc(n) testing_malloc(n)
#else
#    define my_malloc(n) malloc(n)
#endif

您甚至可以通过使用函数指针支持运行时切换(如果需要的话):

代码语言:javascript
复制
void *(__cdecl *my_malloc)(size_t);
// ...
void SetToTest() { my_malloc = testing_malloc; }
void SetToStandard() { my_malloc = malloc; }
票数 8
EN

Stack Overflow用户

发布于 2010-09-27 20:39:08

您可以从通常可以在C++中找到的源代码构建自己版本的Visual运行时库,该库包含memcpymalloc函数(以及其他函数)。然后将您的程序与自定义CRT连接起来。

或者,您可以使用官方文章中的技术来挂钩分配函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3807505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档