Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > Компилятор MinGW: Две функции с одинаковыми


Автор: Lotrex 5.4.2006, 19:30
Точнее, код одной функции помещается в 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). Кто-нить знает, как с этим боротся??? Может, можно какие-то ключи компилятору сунуть, что бы он все-таки один вариант кода для каждой процедуры в исполняемый файл запихивал, а не два!

Автор: threef 6.4.2006, 13:31
Цитата

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


Может в этом все дело - начало и конец блока ?

Автор: NiJazz 6.4.2006, 16:41
Lotrex, используй пространства имён (namsepaces).

Автор: Lotrex 6.4.2006, 18:04
Цитата

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 с отладочными опциями, и сами увидите, что происходит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)