реклама на сайте
подробности

 
 
> Одна процедура - два имени, фича, при создании библиотек.
SasaVitebsk
сообщение Mar 9 2008, 23:40
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



При создании библиотек (для собственных нужд) столкнулся с проблемкой.

Представьте что делаются две библиотеки для одной и той же задачи. Например, софтовое исполнение и аппаратное. Соответственно все подпрограммы делаются с одинаковыми именами. Для того, чтобы вызывающая прога не видела разницы. Не знала вообще что за библиотека подсунута.

В одной из библиотек есть 2 ф-ции.

Код
void a(int x, int y);
void b(int x, int y);


В другой библиотеке обе ф-ции выполняются с помощью одной, поэтому в реализации написано так

Код
void b(int x, int y)
{
   a(x,y);
}


Компилятор при этом честно генерит:
Код
b: rcall a
    ret


И никакая оптимизация не помогает.
Макроопределениями пользоваться нехочу. Как сделать чтобы компилятор вместо вызова одной подставлял обращение к другой. Фактически, чтобы он сделал бы две метки (при компиляции программы) на одну процедуру?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Mar 10 2008, 11:13
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(SasaVitebsk @ Mar 10 2008, 01:40) *
При создании библиотек (для собственных нужд) столкнулся с проблемкой....
Немного не понятно, вы хотите, чтобы обе библиотеки одновременно присутствовали во флеши и выбирались софтовым переключателем или на этапе линковки подставлялась одна из двух?

Цитата(DRUID3 @ Mar 10 2008, 10:40) *
Если есть массив указателей и обращение только к одной из них поймет ли компилятор, что вторую не нужно помещать во флешь? Даже если в программе обращение только к одной. А если и поймет - то каждый ли? Где это ?
Стандартизированно это или нет не знаю, но обычно хороший компилятор не линкует те модули, к которым нет обращений. Наоборот, всегда есть расширения, которые позволяют принудительно прилинковать такие модули. Например в ИАР это: __root
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 14 2008, 20:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Baser @ Mar 10 2008, 15:13) *
Немного не понятно, вы хотите, чтобы обе библиотеки одновременно присутствовали во флеши и выбирались софтовым переключателем или на этапе линковки подставлялась одна из двух?


Всё проще.

Представляем что есть несколько процедур вызываемых из головы
А
В
С
Д
Программа в голове написана и работает. При чём не имеет значения какую именно библиотеку я подключу. Реализации одинаковы.

Теперь о библиотеках.
В одной библиотеке
Полностью реализованы А,В,Д а функция С ничем не отличается от B
Дабы сохранить совместимость я пишу

void C(void)
{
B();
}

И компилятор честно компилит мне
C:
rcall B
ret

Мне это не совсем понятно. На асме я бы сделал следующим образом

С:
B:
.....
ret

Ну и конструкция
rcall
ret
тоже вызывает у меня непонятки. Я бы на асме написал
rjmp


Включена максимальная оптимизация по скорости! Соптимизировать такие участки - это же пару пустяков и реальный выигрыш. С чем это связано?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 22:34
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SasaVitebsk @ Mar 14 2008, 22:23) *
И компилятор честно компилит мне
C:
rcall B
ret

Мне это не совсем понятно. На асме я бы сделал следующим образом

С:
B:
.....
ret
Попробуйте все же линкеру определить новый символ и присвоить ему адрес имеющейся процедуры, добаваив в скрипт или командную строку -DC=B. Вы получите именно желаемое - метку С с таким же адресом, что и B.

Препроцессор, я так понимаю, вам не нравится потому что хотите подключать к проекту уже скомпилированные библиотеки? Насколько мне известно, многие, кто пытался идти таким путем, приходили в конце концов к включению исходников библиотеки в проект. А в борьбе с путаницой хорошо помогает система контроля версий (svn, bazaar, cvs и т.д.)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 05:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016