Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переопределение встроенной printf
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
msalov
Добрый день.
Столкнулся с проблемой: реализовал свои функции printf (на базе реализации от ChaN-а), puts и putchar. Всё отлично линкуется, прототипы объявлены в самописном заголовочном файле. Оптимизация отрабатывает нормально (вместо printf подставляется puts и линкуется куда надо). Прототипы моей реализации совместимы со стандартными
Код
int putchar (int c);
int puts (const char *s);
__attribute__ ((format (printf, 1, 2)))
int printf (const char *fmt, ...);

Проблема собственно в том что как только я пытаюсь использовать не самописный заголовочный файл, а стандартный stdio.h, линкер пытается тянуть стандартную реализацию. Сужу по ошибкам линкера
Код
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-closer.o): In function `__close_r':
closer.c:(.text._close_r+0x10): warning: _close is not implemented and will always fail
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-fstatr.o): In function `__fstat_r':
fstatr.c:(.text._fstat_r+0x12): warning: _fstat is not implemented and will always fail
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-isattyr.o): In function `__isatty_r':
isattyr.c:(.text._isatty_r+0x10): warning: _isatty is not implemented and will always fail
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-lseekr.o): In function `__lseek_r':
lseekr.c:(.text._lseek_r+0x14): warning: _lseek is not implemented and will always fail
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-readr.o): In function `__read_r':
readr.c:(.text._read_r+0x14): warning: _read is not implemented and will always fail
/opt/gnurx_v11.03_elf-1/bin/../lib/gcc/rx-elf/4.5-GNURX_v11.03/../../../../rx-elf/lib/libc.a(lib_a-writer.o): In function `__write_r':
writer.c:(.text._write_r+0x14): warning: _write is not implemented and will always fail

Может кто подскажет как объяснить линкеру что так поступать не надо и почему такое происходит?

UPD Стоит только написать на форуме, как ответ находится самостоятельно sm.gif Судя по всему дело было в putchar. В stdio.h эта функция объявлена каким-то интересным образом что вызов превращается препроцессором в
Код
   (--((_impure_ptr->_stdout))->_w < 0 ? ((_impure_ptr->_stdout))->_w >= ((_impure_ptr->_stdout))->_lbfsize ? (*((_impure_ptr->_stdout))->_p = ('*')), *((_impure_ptr->_stdout))->_p != '\n' ? (int)*((_impure_ptr->_stdout))->_p++ : __swbuf_r(_impure_ptr, '\n', (_impure_ptr->_stdout)) : __swbuf_r(_impure_ptr, (int)('*'), (_impure_ptr->_stdout)) : (*((_impure_ptr->_stdout))->_p = ('*'), (int)*((_impure_ptr->_stdout))->_p++));
что и тянуло библиотечную реализацию. Хотя printf("\n") трансформируется в голый вызов моего putchar.
Genadi Zawidowski
(putchar)(value) обрабатываться препроцессором не будет.
msalov
Спасибо, буду знать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.