Перегруженные функции в C++
Moderator: Shaos
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Имеется ввиду вот это?
https://ru.wikipedia.org/wiki/%D0%9F%D0 ... 0%B8%D0%B9
Просто разные функции с одним и тем же именем - в Сях это невозможно, а в Плюсах - это одна из основных фич...
https://ru.wikipedia.org/wiki/%D0%9F%D0 ... 0%B8%D0%B9
Просто разные функции с одним и тем же именем - в Сях это невозможно, а в Плюсах - это одна из основных фич...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Junior
- Posts: 1
- Joined: 03 Feb 2016 05:00
Re: Перегруженные функции в C++
Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.
Ведущий поставщик программных обеспечений - http://ru.intechcore.com/
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
Напишу сюда, чтобы не открывать новую тему...
Решил я перекомпилировать исходники Pom1 - Apple-1 emulator чтобы избыавиться от вызова
MSVCRT100.DLL (я так уже делал с z80.dll), но случилась непонятная мне трабла...
Pom1 - Apple-1 emulator использует SDL.dll, а значит у меня есть заголовочный
файл SDL.h и куча других заголовочных файлов типа SDL_Хххх.h , где объявлены
все функции SDL.dll.
При компиляции VC зачем-то "декорирует" имена этих функций префиксом "_", а потом сам же их
и не находит...
http://forum.developing.ru/archive/inde ... 10541.html
Но вот побороть это пока никак не смог...
Решил я перекомпилировать исходники Pom1 - Apple-1 emulator чтобы избыавиться от вызова
MSVCRT100.DLL (я так уже делал с z80.dll), но случилась непонятная мне трабла...

Pom1 - Apple-1 emulator использует SDL.dll, а значит у меня есть заголовочный
файл SDL.h и куча других заголовочных файлов типа SDL_Хххх.h , где объявлены
все функции SDL.dll.
При компиляции VC зачем-то "декорирует" имена этих функций префиксом "_", а потом сам же их
и не находит...

Я так подозреваю, что проблема похожа на обсуждаемую вот здесь:Linking...
main.obj : error LNK2001: unresolved external symbol _SDL_ShowCursor
keyboard.obj : error LNK2001: unresolved external symbol _SDL_ShowCursor
main.obj : error LNK2001: unresolved external symbol _SDL_EnableUNICODE
main.obj : error LNK2001: unresolved external symbol _SDL_EnableKeyRepeat
main.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
keyboard.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
options.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
main.obj : error LNK2001: unresolved external symbol _SDL_WM_SetCaption
main.obj : error LNK2001: unresolved external symbol _SDL_Quit
main.obj : error LNK2001: unresolved external symbol _SDL_Init
keyboard.obj : error LNK2001: unresolved external symbol _SDL_PollEvent
options.obj : error LNK2001: unresolved external symbol _SDL_PollEvent
m6502.obj : error LNK2001: unresolved external symbol _SDL_CreateThread
m6502.obj : error LNK2001: unresolved external symbol _SDL_GetTicks
screen.obj : error LNK2001: unresolved external symbol _SDL_GetTicks
m6502.obj : error LNK2001: unresolved external symbol _SDL_Delay
screen.obj : error LNK2001: unresolved external symbol _SDL_Delay
m6502.obj : error LNK2001: unresolved external symbol _SDL_WaitThread
screen.obj : error LNK2001: unresolved external symbol _SDL_UpdateRect
options.obj : error LNK2001: unresolved external symbol _SDL_UpdateRect
screen.obj : error LNK2001: unresolved external symbol _SDL_FillRect
options.obj : error LNK2001: unresolved external symbol _SDL_FillRect
screen.obj : error LNK2001: unresolved external symbol _SDL_MapRGB
screen.obj : error LNK2001: unresolved external symbol _SDL_GetVideoSurface
options.obj : error LNK2001: unresolved external symbol _SDL_GetVideoSurface
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/POM1.exe : fatal error LNK1120: 17 unresolved externals
Error executing link.exe.
http://forum.developing.ru/archive/inde ... 10541.html
Но вот побороть это пока никак не смог...

iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
С-компилятор компилирует в _name, а C++ компилятор в какие-то свои более запутанные крокозябры
если надо чтобы компилятор C++ скомпилировал в _name, то надо чтобы в H-файле у объявлений функций стоял модификатор "C"
P.S. в данном конкретном случае скорее всего либа стыковочная не прилинкована, которая потом будет цеплять SDL.dll
если надо чтобы компилятор C++ скомпилировал в _name, то надо чтобы в H-файле у объявлений функций стоял модификатор "C"
P.S. в данном конкретном случае скорее всего либа стыковочная не прилинкована, которая потом будет цеплять SDL.dll
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
Напишу здесь, чтобы не открывать лишний топик... Вопрос к Shaos-у.
Я тут читаю исходник эмулятора БК-0010, и что-то меня один момент смущает.
Ощущение, что автор дважды "перебдел"...
В модуле Covox.cpp :
Если я правильно понимаю:
Но дальше у автора снова:Как-то это странно, но может я чего не понимаю в тонкостях С++ ?
Я тут читаю исходник эмулятора БК-0010, и что-то меня один момент смущает.
Ощущение, что автор дважды "перебдел"...
В модуле Covox.cpp :
Code: Select all
void CCovox::SetWord (int addr, WORD value)
{
ASSERT (addr == 0177714);
if (addr == 0177714)
{
SetSample (value);
}
}
Т.е. если addr не равен 0177714 то дальше ничего не случится.Функция assert оценивает выражение, которое передается ей в качестве аргумента,
через параметр expression.
Если аргумент-выражение этого макроса в функциональной форме равно нулю
(т.е. выражение ложно), сообщение записывается на стандартное устройство
вывода ошибок и вызывается функция abort, работа программы прекращается.
Но дальше у автора снова:
Code: Select all
if (addr == 0177714)
{
SetSample (value);
}
iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
Всё просто - ассерт скомпилируется только в дебаге:)
А в релизной сборке его быть недолжно
А в релизной сборке его быть недолжно
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
Shaos, у меня что-то Визуал Студия 5.0 ругается на вот такую сточку:
говорит: что UINT_PTR нигде не объявлен...
что несколько странно...
Я посмотрел - все так делают: C++ - Creating a submenu
Но с другой стороны сделал поиск на слово UINT_PTR в папке DevStudio - оно не находится...
P.S. Что-то мне кажется, UINT_PTR - не для Визуал Студии 5.0...
http://vsokovikov.narod.ru/New_MSDN_API ... indows.htm
У меня и файла Basetsd.h нет в DevStudio...
Заменил вот так, и оно без ошибок проехало...
Code: Select all
AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Menu");

Я посмотрел - все так делают: C++ - Creating a submenu
Но с другой стороны сделал поиск на слово UINT_PTR в папке DevStudio - оно не находится...

P.S. Что-то мне кажется, UINT_PTR - не для Визуал Студии 5.0...

Code: Select all
UINT_PTR
Беззнаковый INT_PTR. Этот тип объявлен в Basetsd.h как показано ниже:
#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;
У меня и файла Basetsd.h нет в DevStudio...

Заменил вот так, и оно без ошибок проехало...
Code: Select all
AppendMenu(hMenubar, MF_POPUP, (UINT)hMenu, "Menu");
iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
видимо он сильно позже появился
я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно
я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
Shaos, еще проблемка есть, может знаешь как решить:
Я создаю вот это окно "Digital Display" в процессе ATTACH DLL-ки.

Его HWND hwnd объявлена внутри как глобальная, и понятно, что когда окно создано,
то hwnd его внутри известно.
Но когда я вызываю экспортируемую из DLL-ки функцию:
То в этой функции hwnd уже неизвестна.
Я помню, что Венда каждому процессу, обращающемуся к DLL, создает новую память.
Вот как бы значение hwnd не терять при этом?
Я создаю вот это окно "Digital Display" в процессе ATTACH DLL-ки.
Его HWND hwnd объявлена внутри как глобальная, и понятно, что когда окно создано,
то hwnd его внутри известно.
Но когда я вызываю экспортируемую из DLL-ки функцию:
Code: Select all
extern "C" VOID __declspec(dllexport) disp(INT arg)
{
...
}
Я помню, что Венда каждому процессу, обращающемуся к DLL, создает новую память.
Вот как бы значение hwnd не терять при этом?
iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
передай аргументом
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
А некому передать этот аргумент.Shaos wrote:передай аргументом
В вызывающей эту функцию программе
Code: Select all
extern "C" VOID __declspec(dllexport) disp(INT arg)
{
...
}
Code: Select all
call disp; display.dll
Поставил пока hMwnd = FindWindow(...), что выглядит как-то натянуто...
Искать hwnd собственного окна...

iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
ну тогда можно через реестр передать или на худой конец через файл
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Перегруженные функции в C++
Да ты чо?Shaos wrote:ну тогда можно через реестр передать или на худой конец через файл

с записью файл он шустр... а запись в реестр - тоже запись в файл.
Это же происходит при каждой выдаче байта в порт!

Есть какие-то специальные области памяти для межпотокового общения.
Давно читал я и не понял и забыл. Думал, может, ты помнишь...

iLavr
-
- Admin
- Posts: 24086
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Перегруженные функции в C++
так тебе только адрес передать через файл, а потом все через этот адрес перекидывать
Я тут за главного - если что шлите мыло на me собака shaos точка net