Своя версия функции из стандартной библиотеки С — возможно ли?

В исходный код программы на языке Си нужно вставить свою версию функции, которая уже есть в одной из подключаемых библиотек. При попытке компиляции возникает ошибка - данная функция уже определена. Конечно можно изменить имя и проблем не будет. А можно ли как-то "запретить" отдельную библиотечную функцию, не исключая всей библиотеки, чтобы иметь возможность написать и использовать в программе свою версию с тем же именем?
  • Вопрос задан
  • 2866 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Предыдущие ораторы @fornit1917 @GavriKos и @DancingOnWater насоветовали какой-то странной фигни.
Просто определяйте свою функцию и всё. Вот вам пример:
$ cat print.c 
#include <stdio.h>
#undef printf
int printf(const char *fmt, ...)
{
        puts("my printf\n");
        return 0;
}
int main()
{
        printf("%d\n", 10);
        return 0;
}
$ gcc print.c -o print
$ ./print 
my printf

Если будут ошибки времени компиляции внимательно читайте их текст:
- возможно библиотечная функция определена в заголовочном файле в виде макроса. Используйте #undef чтобы удалить такое определение.
- возможно прототип вашей реализации не совпадает с прототипом объявленным в заголовочных файлах. Сделайте так, чтобы ваш прототип совпадал.
- возможно библиотечная функция определена в заголовочном файле. Насколько мне известно ни одна функция стандартной библиотеки так не делает.

Эта рекомендация основана на базовых принципах статической и динамической линковки. Задавайте вопросы, если нужны дальнейшие пояснения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
fornit1917
@fornit1917
Не очень хорошо разбираюсь в Си, но могу предположить, что вы можете сделать это с помощью макросов #define. Функцию сделать со своим названием, а потом с помощью макроса заменять стандартное название на свое.
Ответ написан
@DancingOnWater
Да, конечно, выкиньте хедер сторонней библиотеки из тех файлов, откуда надо и замените своим.
Если этого сделать нельзя - переименовать свою функцию. Это единственно верный путь.
Ответ написан
Комментировать
Ostan
@Ostan Автор вопроса
Правильный ответ дал jcmvbkbc - надо использовать #undef. Я знал об этом, но у меня всё равно не работало. Как оказалось, из-за того, что я использую CCTools IDE - компилятор и среда разработки под Android. Проверил на MVS2008 и всё заработало, правда с предупреждениями.
Ответ написан
Комментировать
@deleted-StrangerInRed
и без #undef директивы работает (clion + llvm), получается, что ты как бы имплементишь фукнцию из libstd
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы