Пишу, по большей части, про историю, свою жизнь и немного про программирование.

VC++

Чудны дела твои, Билли! Для того, чтобы функция из DLL импортировалась под своим именем (GetProcAddress(dllHandler, "some_func"), какой-то забавный дядя в недрах Microsoft придумал вот такую строку:

extern "C" __declspec(dllexport) int __cdecl some_func(void)

кого мне за это расцеловать? кто-нибудь знает, почему сделано так, а не иначе?

10 комментариев
Dima 2003

А чем плохо-то?

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Dima:

Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?

Dima 2003

<blockquote>Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?</blockquote>
Вообще-то эти директивы каждая предназначена для своих целей…

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Dima:

Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»

Dima 2003

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 ) ]

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Dima:

Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»

Евгений 2003

extern ’C’ нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Евгений:

Страус труп, а нам мучаться. Вот уродец. А как такую функцию потом загружать? Под каким именем?

Dima 2003

<blockquote>extern ’C’ нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции. </blockquote>
Ну да, я ведь и говорю, что именно это нужно для того, чтобы функция экспортировалась под своим именем, а всё остальное (dllexport, __cdecl) для других целей.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Dima:

В том-то и прикол, что без любой из директив получается что-то вроде «?some_func@0»