Re: Как приводить указатель на функцию?
От: Павел Кузнецов  
Дата: 09.10.02 10:10
Оценка: 9 (2)
Здравствуйте Pushkin, Вы писали:

P>typedef void (*myfunctype)(int);

P>myfunctype myfunc=(myfunctype)GetProcAdress(hLib,"MyFunc");
P>(*myfunc)(1);

P>а нельзя ли это сделать покороче? особенно меня typedef раздражает


Без typedef:

void(*myfunc)(int) = (void(*)(int))GetProcAdress(hLib,"MyFunc");
(*myfunc)(1);


Без временной переменной:

((void(*)(int))GetProcAdress(hLib,"MyFunc"))(1);


P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Как приводить указатель на функцию?
От: Павел Кузнецов  
Дата: 09.10.02 11:26
Оценка: 4 (1)
Здравствуйте Кодт, Вы писали:

ПК>>преобразования из void* в указатель на функцию стандартом не разрешены.


К>Опаньки :wow:

К>А как же тогда быть? Или производители компиляторов, все как один, решили сделать поблажку?

Не все, а те, на чьих платформах sizeof(void*) == sizeof(void(*)()). На некоторых платформах (например, Unisys 1100) это не так.

К>Или это осталось для совместимости с Си — как "old-style-cast"?


В C та же ситуация.

К>Если порассуждать, то void* вообще бросает вызов всей идеологии строгой типизации! (Т.е. по идее деградировать любой тип до void можно, а обратно нет). И как с этим жить? :xz:


Любой указатель на объект можно привести к void* и обратно без потери информации. Для указателей на функции подобных гарантий стандарт не дает. Зато указатель на функцию можно привести к указателю на функцию другого типа и обратно без потери информации. Поэтому, вместо void* для функций универсальным типом указателя может служить что-нибудь типа void(*)().
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Как приводить указатель на функцию?
От: Pushkin Россия www.linkbit.com
Дата: 09.10.02 09:56
Оценка:
Я могу сделать так:

typedef void (*myfunctype)(int);
myfunctype myfunc=(myfunctype)GetProcAdress(hLib,"MyFunc");
(*myfunc)(1);

а нельзя ли это сделать покороче?
особенно меня typedef раздражает
Re[2]: Как приводить указатель на функцию?
От: Аноним  
Дата: 09.10.02 10:29
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>((void(*)(int))GetProcAdress(hLib,"MyFunc"))(1);


По-моему, это все же недостаточно уродливо. Лучше так:

(reinterpret_cast<void(*)(int)>(GetProcAdress(hLib,"MyFunc")))(1);


ПК>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.


А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'?
Re[2]: Как приводить указатель на функцию?
От: Кодт Россия  
Дата: 09.10.02 11:01
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.


Опаньки
А как же тогда быть? Или производители компиляторов, все как один, решили сделать поблажку? Или это осталось для совместимости с Си — как "old-style-cast"?

Если порассуждать, то void* вообще бросает вызов всей идеологии строгой типизации! (Т.е. по идее деградировать любой тип до void можно, а обратно нет). И как с этим жить?
Перекуём баги на фичи!
Re[3]: Как приводить указатель на функцию?
От: dupamid Россия  
Дата: 09.10.02 11:03
Оценка:
Здравствуйте Аноним, Вы писали:

А>А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'?


Хорошее замечание! Она возвращает FARPROC, который что-то типа typedef int (FAR WINAPI *FARPROC)() так что здесь MS не ошиблась
Re[2]: Как приводить указатель на функцию?
От: Pushkin Россия www.linkbit.com
Дата: 09.10.02 11:17
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>((void(*)(int))GetProcAdress(hLib,"MyFunc"))(1);


спасибо, так просто всё, что даже обидно
всять в скобки одну голую звёздочку не догадался однако
Re[4]: Как приводить указатель на функцию?
От: Аноним  
Дата: 09.10.02 11:34
Оценка:
Здравствуйте dupamid, Вы писали:

А>>А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'?


D>Хорошее замечание! Она возвращает FARPROC, который что-то типа typedef int (FAR WINAPI *FARPROC)() так что здесь MS не ошиблась


И даже не она, а 'GetProcAddress()'.
Re[3]: Как приводить указатель на функцию?
От: Павел Кузнецов  
Дата: 09.10.02 11:35
Оценка:
Здравствуйте Аноним, Вы писали:

ПК>>P.S. Строго говоря, все эти примеры, включая первоначальный, некорректны, т.к. преобразования из void* в указатель на функцию стандартом не разрешены.


А>А почему Вы решили, что 'GetProcAdress()' возвращает 'void*'? :)


Действительно, не void*. Может, когда-то раньше (еще без STRICT) было так? А, может, память шутки шутит... Never mind.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.