Russian Qt Forum

Программирование => С/C++ => Тема начата: Гурман от Марта 27, 2009, 15:39



Название: грубое изменение типа в проекте с qmake
Отправлено: Гурман от Марта 27, 2009, 15:39
для работы с библиотекой, написанной на С, надо заносить по указателю void* указатели на функции-колбэки (они написаны на С)

вот такое вот

    extern "C" void* add_ptr( void* );
    extern "C" void mvardel( int,int );
....
    retval = add_ptr( reinterpret_cast<void*>(mvardel) );


MinGW, как баран, уперся и ругается, что ISO C++ запрещает преобразовывать указатель на функцию в указатель на объект

при чем тут Qt? при том, что проект переносится на Qt и отлаживается в QtCreator, соответственно используется qmake

бубны и чтение мануалов не помогает - возможности отключить контроль этого преобразования у компилятора в файле проекта qmake найти не удалось, искать такой ключ у GCC даже не стал, потому как не вижу как передать влоб ключи компилятору из проекта

есть тут прямой путь?

или только в обход идти, создавая функции-переходники на С, и втыкая их между колбэками и кодом на С++, и add_ptr вызывать в переходниках
это придется на каждый колбэк переходник делать, их несколько десятков, и вызываются они из разных мест, все перепахивать надо...

/*причем Visual Studio это все пропускает даже без замечаний и все прекрасно работает*/


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Rcus от Марта 27, 2009, 16:03
/*shrugs*/ бить C по C :) C-style cast еще не отменили :)


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Гурман от Марта 27, 2009, 16:21
в смысле?

retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*



Название: Re: грубое изменение типа в проекте с qmake
Отправлено: BRE от Марта 27, 2009, 17:47
retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*
А если написать так:
Код
C++ (Qt)
retval = add_ptr( (void*)&mvardel );
 


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Alex Custov от Марта 29, 2009, 04:26
искать такой ключ у GCC даже не стал, потому как не вижу как передать влоб ключи компилятору из проекта

http://doc.trolltech.com/4.4/qmake-manual.html (QMAKE_CXXFLAGS, ...)

P.S. Согласно стандарту всё правильно ругается, т.к. указатель на функцию нельзя гарантированно привести к указателю на объект (т.е. к простому void*).


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Гурман от Марта 30, 2009, 08:09
retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*
А если написать так:
Код
C++ (Qt)
retval = add_ptr( (void*)&mvardel );
 

так тоже нельзя

я то понимаю, что он правильно ругается, но обычно ругань можно отключить если действительно надо

в описание qmake я смотрел, способа это сделать не нашел, если есть, ткните меня носом

пришлось функции в переходнике на С передавать, причем достаточно одного переходника, у него параметр "указатель на функцию", ее тип уже нормально приводится



Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Tonal от Марта 30, 2009, 08:45
Код
C++ (Qt)
#include <iostream>
 
using std::cout;
using std::endl;
 
void f(int, int) {}
 
int add_ptr(void* f) {
 return reinterpret_cast<int>(f);
}
 
int main() {
 cout<<add_ptr((void*)&f)<<endl;
}
 
Таки код нормально компилится и выполняется мингвой.
Плюсовые касты всяко не канают.


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Гурман от Марта 30, 2009, 09:04
хм... вроде я так тоже пробовал...

хотя мог пропустить этот вариант от усталости в пятницу


Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Eugene Efremov от Апреля 25, 2009, 20:18
Ну... Если требуется грубая сила, значит надо использовать грубую силу:

Код
C++ (Qt)
template<class to_t, class from_t> to_t force_cast(from_t t)
{
union
{
to_t to;
from_t from;
} cvt;
cvt.from = t;
return cvt.to;
}
 
void f() {}
 
int main()
{
void (*pf)() = &f;
void *p = force_cast<void* >(pf);
......
 

Да, разумеется, никаких гарантий и все такое. Строго говоря, результат применения такого кода непредсказуем. Но оно сконвертирует что угодно куда угодно, и компилятор это съест. Другой разговор — что будет, когда ты попробуешь этот указатель использовать...



Название: Re: грубое изменение типа в проекте с qmake
Отправлено: Гурман от Апреля 27, 2009, 11:21
все уже давно работает вот в таком варианте

Код:
    retval = add_ptr( (void*) &mvardel );