Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: navrocky от Сентябрь 08, 2010, 15:54



Название: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: navrocky от Сентябрь 08, 2010, 15:54
Бывает удобно, не дописав какой-то метод, пометить его как-то чтобы не забыть... Или когда проект пишет много человек, бывает удобно поставить сообщение в чужом коде в виде ворнинга, типа такого "Вася, я тут понаписал у тебя, проверь"...

К сожалению нет стандартного способа генерить такие ворнинги из кода, у каждого компилятора это делается по своему. В Qt и Boost также нет такой функциональности. Так что я сделал свой вариант.

Пример использования:
Код
C++ (Qt)
...
WARNING( Blah-blah ololo )
 
...
void some_unfinished_func()
{
   REALIZATION_NEEDED;
}
 

Исходник:
Код
C++ (Qt)
#pragma once
 
/*! Crossplatform compiler warning message */
 
/*! Compiler warning message.
 
Using:
 
WARNING(blah-blah)
 
void some_unfinished_func()
{
   REALIZATION_NEEDED;
}
 
*/

 
#define WARNING(msg) __PRAGMA(message (__LOC__#msg))
 
#define NEED_TO_DELETE WARNING(Need to delete)
#define REALIZATION_NEEDED WARNING(Realization needed)
 
////////////////////////////////////////////////////////////////////////////////
// details
 
#ifdef _MSC_VER
#define __PRAGMA(str) __pragma(str)
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "(" __STR1__( __LINE__ ) ") : warning: "
#else
#define __PRAGMA(str) _Pragma(#str)
#define __LOC__
#endif
 


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Авварон от Сентябрь 08, 2010, 20:03
эм а как же #warning ? его что, в msvc нету?


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Denjs от Сентябрь 08, 2010, 23:00
эээээ....
Код:
qDebug() << message;
qWarning() << "mySeperClass::myMegaMethod()[00232]:: WTH!? ";
qFatal("divide: cannot divide by zero");
?
Есть ещё Q_ASSERT(), Q_ASSERT_X(),  Q_CHECK_PTR() ...
неа?

или вы говорите про кучку сообщений на этапе сборки? аналог списка TODO?!
а они не потеряются в куче сообщений которые вываливает компилятор?

расскажите подробнее сценарий применения - после того, как я внес в исходник
Код:
WARNING( Blah-blah ololo )
где ваша ворнинги потом искать, когда и где они "проявлятся"?


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: navrocky от Сентябрь 08, 2010, 23:29
Цитировать
эээээ....
Код:
qDebug() << message;
qWarning() << "mySeperClass::myMegaMethod()[00232]:: WTH!? "
?
Есть ещё Q_ASSERT(), Q_ASSERT_X(),  Q_CHECK_PTR() ...
неа?
неа, это к ворнингам компилятора отношения не имеет.

Цитировать
или вы говорите про кучку сообщений на этапе сборки? аналог списка TODO?!
точно! как я и писал выше, может использоваться в качестве TODO для себя или для других.

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

Цитировать
эм а как же #warning ? его что, в msvc нету?
http://stackoverflow.com/questions/1046821/why-does-not-visual-studio-display-warnings-generated-by-the-warning-directive
http://support.microsoft.com/kb/155196



Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Denjs от Сентябрь 08, 2010, 23:43
И ещё мне кажется ваш код заточен чисто под MS VS ?
это так? на mingw и gcc он не пойдет?
"#pragma once" - разве вместо этого в QT не конструкции "#ifndef / #define / #endif" используются?

Цитировать
Цитировать
или вы говорите про кучку сообщений на этапе сборки? аналог списка TODO?!
точно! как я и писал выше, может использоваться в качестве TODO для себя или для других.
т.е. это ваш способ генерировать Compile-Time сообщения?
в отличии от run-time сообщений qWarning() qDebug() и иже с ними? гм.. ок...

(вы уж извините, но я люблю точно и 3 раза убедиться))))
Цитировать
Цитировать
а они не потеряются в куче сообщений которые вываливает компилятор?
нормальная среда подсвечивает ворнинги, так что это не проблема.
нормальная среда и списки TODO поодерживает, и в идеале - достаточно написать в коде вещь типа
Код:
//TODO: my todo message
что бы появилась ещё одна todo-шка в списке прямо в среде. вот кажись эклипс именно так и делает...
.. но не суть) это я так.. к слову...


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: navrocky от Сентябрь 08, 2010, 23:48
И ещё мне кажется ваш код заточен чисто под MS VS ?
это так? на mingw и gcc он не пойдет?
"#pragma once" - разве вместо этого в QT не конструкции "#ifndef / #define / #endif" используются?
gcc отлично отрабатывает #pragma once, моя основная среда - это как раз gcc.

А #ifndef / #define / #endif это, имхо, геморрой..

Хотя да, согласен что это не стандарт и, возможно, найдется такой компилятор, который это не сожрет.


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: navrocky от Сентябрь 09, 2010, 00:00
Цитировать
нормальная среда и списки TODO поодерживает, и в идеале - достаточно написать в коде вещь типа
Ваши бы слова да разрабам MSVS  в уши ) Отменное гов..eцо этот MSVS я б сказал...


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Blackwanderer от Сентябрь 09, 2010, 07:33
Цитировать
нормальная среда и списки TODO поодерживает, и в идеале - достаточно написать в коде вещь типа
Ваши бы слова да разрабам MSVS  в уши ) Отменное гов..eцо этот MSVS я б сказал...
В MSVS 2010 реализовано. Вроде даже по дефолту.


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Sahab от Сентябрь 09, 2010, 08:50
Код:
Ваши бы слова да разрабам MSVS  в уши ) Отменное гов..eцо этот MSVS я б сказал...
а что лучше?
vim/Emacs?))))


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: navrocky от Сентябрь 09, 2010, 09:59
Код:
Ваши бы слова да разрабам MSVS  в уши ) Отменное гов..eцо этот MSVS я б сказал...
а что лучше?
vim/Emacs?))))
Да что угодно: kdevelop, netbeans, qtcreator...


Название: Re: Кроссплатформенные пользовательские warning (gc
Отправлено: SASA от Сентябрь 09, 2010, 14:22
Не по теме.
Отменное гов..eцо этот MSVS я б сказал...
Так богохульствовать... был бы век 15, давно бы на костре изжарился, неверный!!! ;D

По теме. Вещь полезная.
А Вы уверены, что
Код:
 #define __PRAGMA(str) _Pragma(#str) 
пройдёт для всех компиляторов.


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Sahab от Сентябрь 09, 2010, 15:26
Код:
Да что угодно: kdevelop, netbeans, qtcreator...
не смешите...


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Sahab от Сентябрь 09, 2010, 15:29
kdevelop под венду жесть,
netbeans тормозной(немного :D) + жаба...,
qtcreator уже поинтересней... развивается конечно побыстрому, много новых фич... но если быть честным... не дотягивает до студии


Название: Re: Кроссплатформенные пользовательские warning (gc
Отправлено: navrocky от Сентябрь 09, 2010, 16:10
Цитировать
А Вы уверены, что
Код:
 #define __PRAGMA(str) _Pragma(#str) 
пройдёт для всех компиляторов.

_Pragma описана в стандарте C++, однако мелкомягкие как всегда положили на стандарт и изобрели свою __pragma =)

Цитировать
kdevelop под венду жесть,
netbeans тормозной(немного ) + жаба...,
qtcreator уже поинтересней... развивается конечно побыстрому, много новых фич... но если быть честным... не дотягивает до студии
Я использую netbeans под линуксом, я доволен, все что нужно в нем есть и работает отлично, а тормоза на моем AthlonX4 мне не заметны.

kdevelop под линуксом очень даже ничего, особенно в плане разработки под Qt, дополняет имена сигналов, реализует методы и тд. и тп., работает при этом очень шустро.

qtcreator простенькая детская среда, но многое в ней есть, за что - зачот :)

А студия (без дополнительных ассистентов) это УГ, да плюс еще компилятор с кучей несоотвествий со стандартом, ну и компилит в пи раз медленнее чем gcc под линуксом на одной и той же машине. Единственный плюс студии - это нормально работающий отладчик.


Название: Re: Кроссплатформенные пользовательские warning (gcc, msvs)
Отправлено: Авварон от Сентябрь 09, 2010, 16:23
вы забыли одну маленькую вещь - msvc генерит в 500раз лучший код, чем mingw (по размеру и скорости), потому и работает медленней.
Ну по крайней мере в он не делает таких конструкций (в отличие от мингвы):
Код:
CPU Disasm
Address   Hex dump          Command                                          Comments
004013F1  |. /EB 01         JMP     SHORT 004013F4
004013F3  |  |90            NOP
004013F4  |> \55            PUSH    EBP
или
Код:
CPU Disasm
Address   Hex dump          Command                                          Comments
004012D0  /.  55            PUSH    EBP
004012D1  |.  8B0D 0CFF4400 MOV     ECX,DWORD PTR DS:[<&msvcrt._onexit>]
004012D7  |.  89E5          MOV     EBP,ESP
004012D9  |.  5D            POP     EBP