【问题标题】:How to undef a library function to use our version of same function如何取消定义库函数以使用我们版本的相同函数
【发布时间】:2013-07-12 12:14:49
【问题描述】:

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

【问题讨论】:

  • 试试#define that_function my_function
  • 这是 C++ 被发明的原因之一。
  • malloc()吗?只是好奇。
  • 您对此次更换的范围有何期望?例如,如果您要替换malloc(),这是否会影响strdup() 的行为,它可能会调用malloc()
  • 有几种可能隐藏此答案中提到的库导出的函数:stackoverflow.com/a/6540059/694576 到类似问题。

标签: c


【解决方案1】:

您可以执行以下操作:

#define function_name function_name_orig
#include <library.h>
#undef function_name

int function_name() {
    /* ... */
}

这样函数就不会被头部定义,因为它会被function_name_orig替换。头文件中的 getter 或 setter 实现可能会继续工作 - 即使它们使用 function_name,因为这些调用也将被替换。

【讨论】:

  • &lt;library.h&gt; 会对function_name 执行自己的预处理器魔法有一个小危险。它甚至可以定义function_name 来完全调用其他函数。
【解决方案2】:

我刚刚遇到这个问题,我无法回答 @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

【讨论】:

    【解决方案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) 的原型,则会出现错误。

    【讨论】:

    • 这只有在“原始”scanf() 是宏时才有效。
    猜你喜欢
    • 2022-01-23
    • 2016-06-30
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2014-03-30
    相关资源
    最近更新 更多