Здравствуйте Pushkin, Вы писали:
P>typedef void (*myfunctype)(int); P>myfunctype myfunc=(myfunctype)GetProcAdress(hLib,"MyFunc"); P>(*myfunc)(1);
P>а нельзя ли это сделать покороче? особенно меня typedef раздражает
ПК>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.
А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'?
Здравствуйте Павел Кузнецов, Вы писали:
ПК>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.
Опаньки
А как же тогда быть? Или производители компиляторов, все как один, решили сделать поблажку? Или это осталось для совместимости с Си — как "old-style-cast"?
Если порассуждать, то void* вообще бросает вызов всей идеологии строгой типизации! (Т.е. по идее деградировать любой тип до void можно, а обратно нет). И как с этим жить?
Здравствуйте Кодт, Вы писали:
ПК>>преобразования из void* в указатель на функцию стандартом не разрешены.
К>Опаньки :wow: К>А как же тогда быть? Или производители компиляторов, все как один, решили сделать поблажку?
Не все, а те, на чьих платформах sizeof(void*) == sizeof(void(*)()). На некоторых платформах (например, Unisys 1100) это не так.
К>Или это осталось для совместимости с Си — как "old-style-cast"?
В C та же ситуация.
К>Если порассуждать, то void* вообще бросает вызов всей идеологии строгой типизации! (Т.е. по идее деградировать любой тип до void можно, а обратно нет). И как с этим жить? :xz:
Любой указатель на объект можно привести к void* и обратно без потери информации. Для указателей на функции подобных гарантий стандарт не дает. Зато указатель на функцию можно привести к указателю на функцию другого типа и обратно без потери информации. Поэтому, вместо void* для функций универсальным типом указателя может служить что-нибудь типа void(*)().
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Как приводить указатель на функцию?
От:
Аноним
Дата:
09.10.02 11:34
Оценка:
Здравствуйте dupamid, Вы писали:
А>>А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'?
D>Хорошее замечание! Она возвращает FARPROC, который что-то типа typedef int (FAR WINAPI *FARPROC)() так что здесь MS не ошиблась
Здравствуйте Аноним, Вы писали:
ПК>>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.
А>А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'? :)
Действительно, не void*. Может, когда-то раньше (еще без STRICT) было так? А, может, память шутки шутит... Never mind.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен