Перегруженные функции в C++

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos объясни популярно про Перегруженные функции в C++?

Раньше я сам разбирался в этом вопросе, а сейчас что-то из головы выветрилось...
Какая-то там "заподляна" с возвратом что-ли была...
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Имеется ввиду вот это?

https://ru.wikipedia.org/wiki/%D0%9F%D0 ... 0%B8%D0%B9

Просто разные функции с одним и тем же именем - в Сях это невозможно, а в Плюсах - это одна из основных фич...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
ArtemZyev
Junior
Posts: 1
Joined: 03 Feb 2016 05:00

Re: Перегруженные функции в C++

Post by ArtemZyev »

Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.
Ведущий поставщик программных обеспечений - http://ru.intechcore.com/
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Напишу сюда, чтобы не открывать новую тему...

Решил я перекомпилировать исходники Pom1 - Apple-1 emulator чтобы избыавиться от вызова
MSVCRT100.DLL (я так уже делал с z80.dll), но случилась непонятная мне трабла... :-?

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

При компиляции VC зачем-то "декорирует" имена этих функций префиксом "_", а потом сам же их
и не находит... :osad:
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
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

С-компилятор компилирует в _name, а C++ компилятор в какие-то свои более запутанные крокозябры

если надо чтобы компилятор C++ скомпилировал в _name, то надо чтобы в H-файле у объявлений функций стоял модификатор "C"

P.S. в данном конкретном случае скорее всего либа стыковочная не прилинкована, которая потом будет цеплять SDL.dll
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Напишу здесь, чтобы не открывать лишний топик... Вопрос к Shaos-у.

Я тут читаю исходник эмулятора БК-0010, и что-то меня один момент смущает.
Ощущение, что автор дважды "перебдел"...

В модуле Covox.cpp :

Code: Select all

void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}
Если я правильно понимаю:
Функция assert оценивает выражение, которое передается ей в качестве аргумента,
через параметр expression.
Если аргумент-выражение этого макроса в функциональной форме равно нулю
(т.е. выражение ложно), сообщение записывается на стандартное устройство
вывода ошибок и вызывается функция abort, работа программы прекращается.
Т.е. если addr не равен 0177714 то дальше ничего не случится.
Но дальше у автора снова:

Code: Select all

 if (addr == 0177714)
  {
    SetSample (value);
  }
Как-то это странно, но может я чего не понимаю в тонкостях С++ ?
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

Всё просто - ассерт скомпилируется только в дебаге:)
А в релизной сборке его быть недолжно
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Shaos, у меня что-то Визуал Студия 5.0 ругается на вот такую сточку:

Code: Select all

AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Menu");
говорит: что UINT_PTR нигде не объявлен... :o что несколько странно...
Я посмотрел - все так делают: C++ - Creating a submenu

Но с другой стороны сделал поиск на слово UINT_PTR в папке DevStudio - оно не находится... :-?


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

Code: Select all

UINT_PTR	
Беззнаковый INT_PTR. Этот тип объявлен в Basetsd.h  как показано ниже:
#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;
http://vsokovikov.narod.ru/New_MSDN_API ... indows.htm

У меня и файла Basetsd.h нет в DevStudio... :lol:
Заменил вот так, и оно без ошибок проехало...

Code: Select all

AppendMenu(hMenubar, MF_POPUP, (UINT)hMenu, "Menu");
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

видимо он сильно позже появился

я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Shaos, еще проблемка есть, может знаешь как решить:

Я создаю вот это окно "Digital Display" в процессе ATTACH DLL-ки.

Image

Его HWND hwnd объявлена внутри как глобальная, и понятно, что когда окно создано,
то hwnd его внутри известно.

Но когда я вызываю экспортируемую из DLL-ки функцию:

Code: Select all

extern "C" VOID __declspec(dllexport) disp(INT arg)  
{
...
}
То в этой функции hwnd уже неизвестна.

Я помню, что Венда каждому процессу, обращающемуся к DLL, создает новую память.
Вот как бы значение hwnd не терять при этом?
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

передай аргументом
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Shaos wrote:передай аргументом
А некому передать этот аргумент.
В вызывающей эту функцию программе

Code: Select all

extern "C" VOID __declspec(dllexport) disp(INT arg)  
{
...
}
Этот вызов как раз прохачен и может сделать только:

Code: Select all

call disp; display.dll
передавая через стек только свой аргумент (INT arg) .
Поставил пока hMwnd = FindWindow(...), что выглядит как-то натянуто...
Искать hwnd собственного окна... :o
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

ну тогда можно через реестр передать или на худой конец через файл
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Перегруженные функции в C++

Post by Lavr »

Shaos wrote:ну тогда можно через реестр передать или на худой конец через файл
Да ты чо? :o Мне кажется FindWindow(...) лишний тормоз, хотя по сравнению
с записью файл он шустр... а запись в реестр - тоже запись в файл.

Это же происходит при каждой выдаче байта в порт! :o

Есть какие-то специальные области памяти для межпотокового общения.
Давно читал я и не понял и забыл. Думал, может, ты помнишь... :roll:
iLavr
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Перегруженные функции в C++

Post by Shaos »

так тебе только адрес передать через файл, а потом все через этот адрес перекидывать
Я тут за главного - если что шлите мыло на me собака shaos точка net