VC++
Чудны дела твои, Билли! Для того, чтобы функция из DLL импортировалась под своим именем (GetProcAddress(dllHandler, "some_func"), какой-то забавный дядя в недрах Microsoft придумал вот такую строку:
extern "C" __declspec(dllexport) int __cdecl some_func(void)
кого мне за это расцеловать? кто-нибудь знает, почему сделано так, а не иначе?
А чем плохо-то?
Комментарий для Dima:
Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?
<blockquote>Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?</blockquote>
Вообще-то эти директивы каждая предназначена для своих целей…
Комментарий для Dima:
Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»
extern «C’ — это как раз для распознавания имени [ >>> ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Export_C_Functions_for_Use_in_C_or_C.2b2b_.Language_Executables.asp ) ],
__declspec(dllexport) — это для экспорта в DLL [ >>> ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_using___declspec.28.dllimport.29_.and___declspec.28.dllexport.29.asp ) ],
__cdecl — для изменения обработки переменных в стеке [ >>> ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core___cdecl.asp ) ]
Комментарий для Dima:
Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»
extern ’C’ нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции.
Комментарий для Евгений:
Страус труп, а нам мучаться. Вот уродец. А как такую функцию потом загружать? Под каким именем?
<blockquote>extern ’C’ нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции. </blockquote>
Ну да, я ведь и говорю, что именно это нужно для того, чтобы функция экспортировалась под своим именем, а всё остальное (dllexport, __cdecl) для других целей.
Комментарий для Dima:
В том-то и прикол, что без любой из директив получается что-то вроде «?some_func@0»