Как переименовать / псевдоним функции в C? - PullRequest
2 голосов
/ 23 апреля 2020

Скажем, у меня есть библиотека, которую я создаю, и я хочу вызвать функцию rename или puts, как мне сохранить исходные rename и puts с stdlib или stdio или что-то еще, и все же моя собственная функция будет puts?

#include <stdio.h>

alias puts original_puts;

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

Как я могу выполнить sh что-то для этого ?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Если компилируется с 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
3 голосов
/ 23 апреля 2020

Вы не можете создавать псевдонимы библиотечных функций, но вы можете создавать собственные псевдонимы с помощью директив препроцессора.

Например:

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. Кроме того, когда вы хотите вызвать «настоящую» функцию в своей оболочке, вы можете поместить имя функции в кавычки. Поскольку макрос, выполняющий подстановку, является функционально-подобным макросом, круглые скобки предотвращают подстановку.

...