C++ C/C++;-重写默认函数
我有以下问题: Microsoft Visual Studio(我使用的是2008 SP1)是否提供了覆盖标准C函数的方法,例如C++ C/C++;-重写默认函数,c++,c,visual-studio-2008,malloc,C++,C,Visual Studio 2008,Malloc,我有以下问题: Microsoft Visual Studio(我使用的是2008 SP1)是否提供了覆盖标准C函数的方法,例如malloc,memcpy 假设我有一些外部构建的库,其中包含malloc.obj和memcpy.obj。 库名为Library.lib 我应该如何构建我的项目,以便编译器使用我的(重写的)版本的malloc()和memcpy()例程,而不是提供的那些例程(我假设它们共享相同的语法) 这件事的重点是改变我项目中的每一个malloc,而不用像my_malloc或类似的名字
malloc
,memcpy
假设我有一些外部构建的库,其中包含malloc.obj
和memcpy.obj
。
库名为Library.lib
我应该如何构建我的项目,以便编译器使用我的(重写的)版本的malloc()
和memcpy()
例程,而不是提供的那些例程(我假设它们共享相同的语法)
这件事的重点是改变我项目中的每一个malloc
,而不用像my_malloc
或类似的名字别名,这样我就可以比较性能了
这可能吗?
谢谢。没有尝试过此操作,但是-在项目属性->链接器->输入中,将“忽略所有默认库”设置为“是”。然后设置“附加依赖项”=library.lib;libcmt.lib
这应该包括在标准静态CRT之前的库。所提供的功能链接在每种情况下都是相同的,这应该满足您的需要。尽管malloc/free如何在两个静态lib中链接到操作系统可能存在问题。我假设library.lib还重新定义了realloc/free/calloc等?是否可以更改构建和链接过程,以便替换
memcpy
和malloc
的实现?对这是个好主意吗?不是真的
您最好只使用#define
逻辑将这些函数重命名为memcpy\u testing
和malloc\u testing
,然后使用一个#define
在两者之间切换。这样,您的解决方案对其他构建系统更具可移植性,其他程序员也更清楚地知道您到底在做什么
编辑:
为了与注释保持一致,以下是您在共享头文件中的操作示例:
#ifdef testing
# define my_malloc(n) testing_malloc(n)
#else
# define my_malloc(n) malloc(n)
#endif
如果需要,您甚至可以使用函数指针支持运行时切换:
void *(__cdecl *my_malloc)(size_t);
// ...
void SetToTest() { my_malloc = testing_malloc; }
void SetToStandard() { my_malloc = malloc; }
<> p>您可以在VisualC++运行库(CRT)中建立包含代码< > MeMpY和
或者,您可以使用官方文章中的技术来钩住分配函数。查看NedMalloc的实现,这是一个自定义分配器,他似乎只是使用了#define NedMalloc malloc 头文件说它应该在windows上工作 它的开源网站上也有囤积,所以你可以看看他们是如何做到的
也有C++的问题。如果windows包含“定义新运算符”为只在下面使用malloc,则所有操作都与自定义分配器配合使用。否则,你必须像6个操作符一样来对事物进行C++的分配和删除。显然,这个问题是可以被标记为代码> C/C++ +代码>的问题之一:这里是一个具体的问题,所以我把你的平台添加到标签中。没有标准的方法可以做到这一点(尽管有标准的方法可以做到这一点),所以这将取决于编译器和构建系统。我不同意
#define malloc(n)my_malloc(n)
会更清晰。实际上,在代码本身中执行搜索/替换会更清晰。用#define
替换甚至可能是危险的:例如,查看代码站点,很难判断它是调用系统实现还是调用您自己的,因此很难判断使用哪个deallocator。如果针对仍然使用系统malloc
的代码进行链接(或者如果项目的某些部分忽略了使用#define
),则问题更大我认为我的更名想法和你的想法相反:我建议在代码中写my_malloc
,以明确一些奇怪的事情正在发生,并在标题中写一些类似#ifdef testing
/#定义my_malloc(n)testing\u malloc(n)
/\else
/>定义my_malloc(n)malloc(n)
/#endif
。啊,好的。是的,我同意这样更好。(我将“那些函数”解释为“memcpy
和malloc
”,而不是自定义实现。)抱歉-1,但这并不能回答问题。当需要重写CRT函数时,有很多有用的情况,但是编辑源代码是不可能的。我的设想是,MSVC标准设施不如其他系统(特别是fopen
不支持UTF-8文件名),因此,我可以使第三方封闭源代码静态库支持Unicode文件名的唯一方法是覆盖它们使用的fopen
。你的“备选方案”对我一点帮助都没有,尽管这正是OP所要求的。如果你这样做,那么你将失去这些库实现的所有其他功能,而不仅仅是malloc!