如何取消定义库函数以使用我的相同函数版本。请注意,我需要包含同一文件的其他功能的头文件。所以不包括不是一个选择。有什么方法可以在不更改名称的情况下使用它吗?
问问题
7066 次
3 回答
5
您可以执行以下操作:
#define function_name function_name_orig
#include <library.h>
#undef function_name
int function_name() {
/* ... */
}
这样,函数将不会由标题定义,因为它将被替换为function_name_orig
. 头文件中的 getter 或 setter 的实现可能会继续工作 - 即使它们使用function_name
,因为这些调用也将被替换。
于 2013-07-12T13:01:34.180 回答
0
我刚刚遇到这个问题,我无法回答@urzeit,因为它是 std::sqrt。编译错误是模棱两可的。但是,扩展@urseit 的答案,我管理了这个解决方案:
// These fix occurrences of 'sqrt' on its own:
inline float stdSqrt(float val) { return ::std::sqrt(val); }
inline double stdSqrt(double val) { return ::std::sqrt(val); }
// These fix occurrences of scoped 'std::sqrt':
namespace std {
inline float stdSqrt(float val) { return ::std::sqrt(val); }
inline double stdSqrt(double val) { return ::std::sqrt(val); }
}
// Now we can apply urzeit's answer
#define sqrt(x) stdSqrt(x)r
#include "otherLibraryHeader.h"
#undef sqrt
于 2021-07-20T20:43:24.517 回答
-3
对于 gcc,#undef 似乎可以削减它,只要您为函数保留相同的原型。例如:
#include <stdio.h>
#undef scanf
int scanf(const char * s, ...)
{
printf(s);
return 0;
}
int main()
{
scanf("hello\n");
return 0;
}
使用 -Wall 编译时不会出现警告,但是如果您希望 scanf 具有(比如说)的原型,void scanf(void)
它将给出错误。
于 2013-07-12T12:40:57.830 回答