如何取消定义库函数以使用我们版本的相同函数

Scr*_*ock 6 c

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

urz*_*eit 10

您可以执行以下操作:

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

int function_name() {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

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

  • 有一个小危险,即“&lt;library.h&gt;”会对“function_name”执行自己的预处理器魔法。它甚至可能定义“function_name”来完全调用其他函数。 (3认同)

Mji*_*iig -3

对于 gcc,#undef 似乎可以解决这个问题,只要您为该函数保留相同的原型即可。例如:

#include <stdio.h>
#undef scanf

int scanf(const char * s, ...)
{
    printf(s);
    return 0;
}

int main()
{
    scanf("hello\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用 -Wall 进行编译时不会发出警告,但如果您希望 scanf 有(例如)的原型,void scanf(void)它将给出错误。

  • 仅当“原始”“scanf()”是宏时,这才有效。 (2认同)