Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компилятор MinGW: Две функции с одинаковыми, сигнатурами. Как с этим бороться? 
:(
    Опции темы
Lotrex
  Дата 5.4.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: нет
Всего: 3



Точнее, код одной функции помещается в exe-файл либо дважды, либо.. черт его знает, что происходит.. smile В-общем, все по порядку.

Написал я один тест для проверки одного класса. Вся эта бодяга компилилась в mingw
командой gcc -c -O0 -g3 -Wall. Все исходники прилагаются в архиве вот тут: http://jamwarrior.narod.ru/sources/test.tar.gz
(хотел пристыковать архив к сообщению - не получилось smile )

Когда я зашел в gdb и выполнил команду info functions, сред и прочих сообщений были следующие:
Код

void tifile::tifile();
void tifile::tifile();
void tifile::tifile(char const*);
void tifile::tifile(char const*);
void tifile::~tifile();
void tifile::~tifile();


Что, по две одинаковых функции линкер запихнул в exe-шник?
Дабы прояснить данный вопрос, я набрал:
Код

(gdb) info line tifile::tifile
[0] cancel
[1] all
[2] tifile::tifile(char const*) at ifiles.cpp:28
[3] tifile::tifile() at ifiles.cpp:26
> 3
Line 26 of "ifiles.cpp" starts at address 0x401c4a <_ZN6tifileC1Ev>
   and ends at 0x401c7f <_ZN6tifileC1Ev+53>.


Ну тут ладно, пока усе номално. После этого решил набрать:
Код

(gdb) info line ifiles.cpp:26
Line 26 of "ifiles.cpp" starts at address 0x401ba0 <_ZN6tifileC2Ev>
   and ends at 0x401bd5 <_ZN6tifileC2Ev+53>.

Тута у меня волосы на голове зашевелились... smile Все-таки есть 2 ф-ции с одинаковыми сигнатурами!!! Одна начинается по адресу 0x401c4a (та, которой компилятор дал символьное имя _ZN6tifileC1Ev), другая по адресу 0x401ba0 (та, которой компилятор дал символьное имя _ZN6tifileC2Ev). Кто-нить знает, как с этим боротся??? Может, можно какие-то ключи компилятору сунуть, что бы он все-таки один вариант кода для каждой процедуры в исполняемый файл запихивал, а не два!
PM MAIL ICQ   Вверх
threef
Дата 6.4.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: нет
Всего: 10



Цитата

(gdb) info line ifiles.cpp:26
Line 26 of "ifiles.cpp" starts at address 0x401ba0 <_ZN6tifileC2Ev>
  and ends at 0x401bd5 <_ZN6tifileC2Ev+53>.


Может в этом все дело - начало и конец блока ?
PM MAIL   Вверх
NiJazz
Дата 6.4.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Lotrex, используй пространства имён (namsepaces).
PM MAIL   Вверх
Lotrex
Дата 6.4.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: нет
Всего: 3



Цитата

Lotrex, используй пространства имён (namsepaces).

Народ, видимо не понял, в чем дело... Или я не понял, при чем тут namespaces... smile
Со строкой 26 пример не показателен, поскольку там стоит просто пустой конструктор, а со строкой 27 файла ifiles.cpp, выглядящей так:
Код

tifile::tifile(const char *inifilename)

все абсолютно так же - при вызове двух разнотипных команд об одной и той же функции выдается разная информация.

Странно то, что код, который находится в исходнике на одной строке (к примеру, на 28 строке этого несчастного ifiles.cpp) имеет как бы 2 разных начала и два разных конца - в одном случае выдается сообщение: "Line 28 of "ifiles.cpp" starts at address 0x4021e2 <_ZN6tifileC1EPKc> and ends at 0x402226 <_ZN6tifileC1EPKc+68>.", а в другом случае - сообщение "Line 28 of "ifiles.cpp" starts at address 0x401cf4 <_ZN6tifileC2EPKc> and ends at 0x401d38 <_ZN6tifileC2EPKc+68>.").

Конечно, на выполнении самой проги это не сказывается. Дело в том, что я сделал оболочку для gdb, везде все нормально, но в таких вот "парных" функциях не проставляются точки останова. Иногда - проставляются, но только командой break <имя функции>, а точку останова, поставленную командой break <имя файла>:<номер строки> программа благополучно пролетает. Причем это не глюк моей оболочки - если "ручками" попытатся поставить бряк через <имя ф-ла>:<номер строки> - результат абсолютно такой же. Вот я и думаю - может, можно как-то прогу откомпилить, что бы таких "парных" функций не было. Просто попробуйте откомпилить мои файлы в mingw с отладочными опциями, и сами увидите, что происходит.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.