簡體   English   中英

如何取消定義庫函數以使用我們的相同函數版本

[英]How to undef a library function to use our version of same function

如何取消定義庫函數以使用我的相同函數版本。 請注意,我需要為同一文件的其他函數包含頭文件。 所以不包括它不是一種選擇。 有什么辦法不用改名字就可以使用嗎?

您可以執行以下操作:

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

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

這樣函數就不會被頭文件定義,因為它將被function_name_orig替換。 頭文件中 getter 或 setter 的實現可能會繼續工作 - 即使它們使用function_name ,因為這些調用也將被替換。

我剛剛遇到了這個,我無法回答 @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

對於 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)的原型,它將給出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM