如何 rename/alias C 中的函数?
How to rename/alias a function in C?
假设我有一个正在制作的库,我想调用一个函数 rename
或 puts
,我怎样才能保留原来的 rename
和 puts
stdlib
或 stdio
或其他什么,但我自己的函数是 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" 函数时,可以将函数名称放在引号中。因为进行替换的宏是一个类似函数的宏,括号阻止了替换的发生。
如果用gcc
或clang
编译,你可以用-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
假设我有一个正在制作的库,我想调用一个函数 rename
或 puts
,我怎样才能保留原来的 rename
和 puts
stdlib
或 stdio
或其他什么,但我自己的函数是 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" 函数时,可以将函数名称放在引号中。因为进行替换的宏是一个类似函数的宏,括号阻止了替换的发生。
如果用gcc
或clang
编译,你可以用-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