Russian Qt Forum
Октябрь 01, 2024, 02:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Макрос для лаконичного отображения отладочного вывода  (Прочитано 10514 раз)
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« : Октябрь 17, 2012, 11:03 »

Уверен, что кому нибудь пригодится.

Макрос форматированного вывода в терминальное окно
Код
C++ (Qt)
#include <QRegExp>
 
#define stringify(v1) #v1
#define quote(v1)  stringify(v1)
 
#define STIP_FUNC \
   QString::fromAscii(Q_FUNC_INFO).replace( \
       QRegExp("^.+\\s((?:[\\w\\d]+::)+)?([\\w\\d\\<\\>~]+)(?:\\(.*\\)).*$"), \
       QString(QLatin1String("<\\1\\2()>"))).toAscii().data()
 
#define DEBUG(...)     qDebug()   << __FILE__  ":"  quote(__LINE__) << STIP_FUNC << "\t" ##__VA_ARGS__
#define WARNING(...)   qWarning() << __FILE__  ":"  quote(__LINE__) << STIP_FUNC << "\t" ##__VA_ARGS__

Использование:
Код
C++ (Qt)
DEBUG()   << m_listLastMsg.size() << QString("TEST_1");
WARNING() << m_listLastMsg.size() << QString("TEST_2");
Выведет в терминал что то подобное
Код
C++ (Qt)
..\..\Prog\src\glob_logger.cpp:205 <G_Logger::showMsg()> 30  "TEST_1"
..\..\Prog\src\glob_logger.cpp:206 <G_Logger::showMsg()> 30  "TEST_2"
Записан

Bepec
Гость
« Ответ #1 : Октябрь 17, 2012, 12:09 »

Я думаю у каждого первого, второго и третьего программиста уже были такие макросы. (Были, ибо макросы - это плохо по мнению большинства).

а STIP_FUNC зачем?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #2 : Октябрь 17, 2012, 13:19 »

не совсем понятно зачем нужны __VA_ARGS__ при таком использовании
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #3 : Октябрь 17, 2012, 13:49 »

а STIP_FUNC зачем?

STIP_FUNC это STRIP_FUNC (Клавиатура не хочет иногда печатать r)
Название говорит само за себя. 
Q_FUNC_INFO генерит слишком длинный вывод, QRegExp вынимает из него наименование класса и его функцию.

Были, ибо макросы - это плохо по мнению большинства
Ну тогда давайте все вместе отажемся еще и от шаблонов.  ))))
Записан

Bepec
Гость
« Ответ #4 : Октябрь 17, 2012, 13:51 »

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

Макрос ваш в коде будет понятен только вам. И только после нахождения его объявления и пары минут втупки возможно познать его сакральный смысл.

PS REGEXP на каждый вывод не ахрененно ли тормозит программу? Ради праздного интереса спрашиваю.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #5 : Октябрь 17, 2012, 13:54 »

... зачем нужны __VA_ARGS__ при таком использовании
Это неизвестные аргументы(и их количество) которые вы подсовываете макросу.

Можно ведь использовать и так
Код
C++ (Qt)
WARNING()<< m_listLastMsg.size()
        << QString("TEST_2")
        << "my const char string"
        << 134
        << (QStringList()<< "dssds" << "sdsd" )
        << 152.25F;
Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #6 : Октябрь 17, 2012, 14:06 »

PS REGEXP на каждый вывод не ахрененно ли тормозит программу? Ради праздного интереса спрашиваю.

Я не призывал его использовать везде. А вот при отладке программы он оказывается очень полезным.

Его можно окружить классом который будет вести логирование в Вашем ПО. И при включении логирования с уровнем "debug" REGEXP будет "на каждый вывод ахрененно тормозить программу" и записывать лог с избыточной информацией для более детального анализа что происходит в Вашем ПО.

Извиняюсь, если мой пост нарушил ваше душевное равновесие.
Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #7 : Октябрь 17, 2012, 14:08 »

Не путать шаблоны и макросы, горячее и холодное, петухов и буржуев.
Извиняюсь, тут я конечно погорячился! ))))
Записан

mutineer
Гость
« Ответ #8 : Октябрь 17, 2012, 14:11 »

... зачем нужны __VA_ARGS__ при таком использовании
Это неизвестные аргументы(и их количество) которые вы подсовываете макросу.

Можно ведь использовать и так
Код
C++ (Qt)
WARNING()<< m_listLastMsg.size()
        << QString("TEST_2")
        << "my const char string"
        << 134
        << (QStringList()<< "dssds" << "sdsd" )
        << 152.25F;

А как в приведенном примере поможет __VA_ARGS__ ?
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #9 : Октябрь 17, 2012, 14:26 »

Поможет, попробуйте мой пример, он работает в mingw/msvc
Записан

mutineer
Гость
« Ответ #10 : Октябрь 17, 2012, 14:28 »

Поможет, попробуйте мой пример, он работает в mingw/msvc

Почему-то мне всегда казалось что __VA_ARGS__ содержит неименованые аргументы, переданные макросу в скобках (причем вместе с запятыми между ними). В данном примере __VA_ARGS__ не нужен, как и ## перед ним (зачем оно тут, кстати?)
Записан
Bepec
Гость
« Ответ #11 : Октябрь 17, 2012, 14:42 »

Моё душевное равновесие спокойно и незыблемо - груз погибших пирожков служит ему якорем.

А вопрос быстродействия меня действительно интересует - я занимаюсь ПО для общения с устройствами по RS-485. Задержка в 5-10 мс порушит нахфиг всё общение с устройствами Улыбающийся

Проверьте скорость выполнения даже простейшим elapsed, если можете Улыбающийся
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #12 : Октябрь 17, 2012, 14:51 »

Моё душевное равновесие спокойно и незыблемо - груз погибших пирожков служит ему якорем.
)))))  А у меня чтото болтанка с утра, пойду сейчас тож перекушу.

А вопрос быстродействия меня действительно интересует - я занимаюсь ПО для общения с устройствами по RS-485. Задержка в 5-10 мс порушит нахфиг всё общение с устройствами Улыбающийся
Не поверите, но с такими девайсам я тоже работал, и стопудово обмен рухнет если информацию по каждому байту отправлять в терминал.
А вот если в паузах между отсылкой и приемом то запросто все работать будет.
Записан

Bepec
Гость
« Ответ #13 : Октябрь 17, 2012, 14:53 »

К сожалению в системе сбора данных не бывает перерывов Улыбающийся Имеется только спад активности. И даже в эти моменты 7 мс - слииииишком много Улыбающийся

PS а сколько сил вложено, чтобы отправка/посылка занимали по минимуму, это не описать Веселый
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #14 : Октябрь 17, 2012, 15:02 »

от RegExp можно отказаться только в msvc, т.к. __FUNCTION__ в нем возвращает класс::функ
А вот в mingw облом, приходиться вытаскивать эти значения из Q_FUNC_INFO
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.189 секунд. Запросов: 23.