Перегруженные функции в C++
Moderator: Shaos
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - Joined: 21 Oct 2009 08:08
 - Location: Россия
 
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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
Просто разные функции с одним и тем же именем - в Сях это невозможно, а в Плюсах - это одна из основных фич...
- 
				ArtemZyev
														 - Junior
 - Posts: 1
 - Joined: 03 Feb 2016 05:00
 
Re: Перегруженные функции в C++
Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.
			
			
									
						
							Ведущий поставщик программных обеспечений - http://ru.intechcore.com/
			
						- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - 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
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - 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
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Перегруженные функции в C++
Всё просто - ассерт скомпилируется только в дебаге:)
А в релизной сборке его быть недолжно
			
			
									
						
										
						А в релизной сборке его быть недолжно
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - 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
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Перегруженные функции в C++
видимо он сильно позже появился
я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно
			
			
									
						
										
						я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - 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
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - 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
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Перегруженные функции в C++
ну тогда можно через реестр передать или на худой конец через файл
			
			
									
						
										
						- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - Joined: 21 Oct 2009 08:08
 - Location: Россия
 
Re: Перегруженные функции в C++
Да ты чо?Shaos wrote:ну тогда можно через реестр передать или на худой конец через файл
с записью файл он шустр... а запись в реестр - тоже запись в файл.
Это же происходит при каждой выдаче байта в порт!
Есть какие-то специальные области памяти для межпотокового общения.
Давно читал я и не понял и забыл. Думал, может, ты помнишь...
iLavr
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Перегруженные функции в C++
так тебе только адрес передать через файл, а потом все через этот адрес перекидывать
			
			
									
						
										
						
				