Название: грубое изменение типа в проекте с 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* Код
Название: 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* Код
так тоже нельзя я то понимаю, что он правильно ругается, но обычно ругань можно отключить если действительно надо в описание qmake я смотрел, способа это сделать не нашел, если есть, ткните меня носом пришлось функции в переходнике на С передавать, причем достаточно одного переходника, у него параметр "указатель на функцию", ее тип уже нормально приводится Название: Re: грубое изменение типа в проекте с qmake Отправлено: Tonal от Марта 30, 2009, 08:45 Код Таки код нормально компилится и выполняется мингвой. Плюсовые касты всяко не канают. Название: Re: грубое изменение типа в проекте с qmake Отправлено: Гурман от Марта 30, 2009, 09:04 хм... вроде я так тоже пробовал...
хотя мог пропустить этот вариант от усталости в пятницу Название: Re: грубое изменение типа в проекте с qmake Отправлено: Eugene Efremov от Апреля 25, 2009, 20:18 Ну... Если требуется грубая сила, значит надо использовать грубую силу:
Код
Да, разумеется, никаких гарантий и все такое. Строго говоря, результат применения такого кода непредсказуем. Но оно сконвертирует что угодно куда угодно, и компилятор это съест. Другой разговор — что будет, когда ты попробуешь этот указатель использовать... Название: Re: грубое изменение типа в проекте с qmake Отправлено: Гурман от Апреля 27, 2009, 11:21 все уже давно работает вот в таком варианте
Код: retval = add_ptr( (void*) &mvardel ); |