如何 rename/alias C 中的函数?

How to rename/alias a function in C?

假设我有一个正在制作的库,我想调用一个函数 renameputs,我怎样才能保留原来的 renameputs stdlibstdio 或其他什么,但我自己的函数是 puts?

#include <stdio.h>

alias puts original_puts;

void
puts(char *c) {
  original_puts(c);
}

我怎样才能达到这种效果

您不能为库函数添加别名,但您可以使用预处理器指令为您自己的函数添加别名。

例如:

mylib.h:

#include <stdio.h>

void my_puts(char *c);

#define puts(arg) my_puts(arg)

mylib.c:

void my_puts(char *c)
{
    (puts)(c);
}

现在,任何时候有人调用 puts,它都会代替对 my_puts 的调用。此外,当您想在包装器中调用 "real" 函数时,可以将函数名称放在引号中。因为进行替换的宏是一个类似函数的宏,括号阻止了替换的发生。

如果用gccclang编译,你可以用-Wl,--wrap包裹符号:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int __real_puts(const char *c);
int __wrap_puts(const char *c) {
        __real_puts("Hello");
        __real_puts(c);
        return 0;
}

int main(int argc, char const *argv[]) {
        puts("world");
}   

$ gcc src.c -Wl,--wrap=puts && ./a.out
Hello
world