3

如何取消定义库函数以使用我的相同函数版本。请注意,我需要包含同一文件的其他功能的头文件。所以不包括不是一个选择。有什么方法可以在不更改名称的情况下使用它吗?

4

3 回答 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 回答