LINUX.ORG.RU

Простой отладочный вывод

 


0

0

Как лучше сделать сабж? Нужен обычный поток (или что-то на него похожее), который либо превратится в std::cerr, либо уйдёт из кода.

Я пробовал так:

// debug.hpp
#include <iostream>

static struct Debug {
	template <typename T> Debug& operator<<(T arg)
	{
		(void)arg;
#ifdef DEBUG
		std::cerr << arg;
#endif
		return *this;
	}
} dbg;

// main.cpp
#include "debug.hpp"
//#include <qapplication.h>

int main()
{
	dbg << "Hello" << std::endl;
}

Это почти работает, но не является потоком (что простительно) и не уживается толком с Qt:
test.cpp: In function `int main()':
main.cpp:6: no match for `Debug & << {unknown type}'
/usr/lib/qt-3.3.3/include/qcstring.h:135: candidates are: class QDataStream & operator <<(QDataStream &, const QByteArray &)
/usr/lib/qt-3.3.3/include/qcstring.h:243:                 class QDataStream & operator <<(QDataStream &, const QCString &)
/usr/lib/qt-3.3.3/include/qstring.h:828:                 class QDataStream & operator <<(QDataStream &, const QString &)
/usr/lib/qt-3.3.3/include/qpoint.h:103:                 class QDataStream & operator <<(QDataStream &, const QPoint &)
...
Проблема в endl. Если убрать шаблон и явно записать все варианты - то работает, но копипаста слишком много.

1. Почему не работает в таком виде?

2. Можно ли сделать лучше (но не сильно сложнее)?

★★★★

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

Что-то типа (не тестировал)

#ifdef DEBUG
#define DEBUG_PRINT(x) do {std::cerr << x;} while (0)
#else
#define DEBUG_PRINT(x)
#endif
Если приспичивает иметь синтаксис вида
DEBUG_PRINT() << "blabla"; 
то можно сделать что-то типа такого трюка (не тестировал):
#ifdef DEBUG
#define DEBUG_PRINT()\
  if (true) std::cerr 
#else
#define DEBUG_PRINT()\
  if (false) std::cerr 
#endif

ratatosk
()
Последнее исправление: ratatosk (всего исправлений: 1)
Ответ на: комментарий от unsigned

Видимо, нет такого класса в Qt3. Да и есть проекты без Qt, а решение желательно общее.

Именно поэтому ты выкатил сюда код с Qt'шными заголовками. И что это за проект такой старый, которому ты не можешь уделить пару часов, чтобы портировать на Qt4?

UVV ★★★★★
()
Ответ на: комментарий от unsigned

Хочешь изобретать велосипед, загляни в исходники QDebug.
Ну или ты уже пользуешь std::cerr в Линуксе, для Виндовс есть OutputDebugString: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362(v=vs.85).aspx
Эта тема так же интересна:
http://stackoverflow.com/questions/8375735/how-to-print-to-output-not-stdout-...

UVV ★★★★★
()
Ответ на: комментарий от ratatosk

Если приспичивает иметь синтаксис вида

Ну да, сишный вариант давно сделан, но есть любители угловых скобок :>

то можно сделать что-то типа такого трюка

Я уже не понимаю, почему он не работает. Да и в любом случае, выглядит опасно.

unsigned ★★★★
() автор топика
Ответ на: комментарий от UVV

Именно поэтому ты выкатил сюда код с Qt'шными заголовками

Потому, что только с Qt возникают проблемы - в прочих проектах этот код работает. В представленном виде код собирается, если раскомментировать include - нет. Похоже, что происходит какой-то конфликт манипуляторов iostream и Qt, но я не вижу причины.

И что это за проект такой старый, которому ты не можешь уделить пару часов, чтобы портировать на Qt4?

Не у всех заказчиков есть Qt4. Это оборонка - так что делайте выводы )

Хочешь изобретать велосипед, загляни в исходники QDebug

Загляну, только доберусь до четвёрки.

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

загляни в исходники QDebug

В общем-то, там очевидный копипаст. А хотелось немного обобщённого программирования )

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

Не у всех заказчиков есть Qt4. Это оборонка - так что делайте выводы )

kernel version 2.2.x ещё небось? )

UVV ★★★★★
()
Ответ на: комментарий от unsigned

Это оборонка - так что делайте выводы

Не могу, здравый смысл не позволяет.

UVV ★★★★★
()
Ответ на: комментарий от UVV

kernel version 2.2.x ещё небось? )

Обижаешь, на 2.4 уже перешли. Зато софт на Qt2 ещё кое-где работает.

unsigned ★★★★
() автор топика

макрос на подобие:

#ifdef DEBUG
 LOG_ERROR(s)  (cerr << s)
#else
 LOG_ERROR(s)
#endif

main() {
  LOG_ERROR("my error");
}
всё это можно расширить, добавить различные урони протоколирования, и т.п.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от UVV

Он намекает, что Qt4 для оборонной промышленности не прошла сертификацию.

Знакомые пишут для оборонки на Qt4.

2 solovey:

Так для этого нужно digia денег дать, причем не мало...

Ты еще предложи минобороны выложить патчи ядра для МСВС :)

unfo ★★★★★
()

Направь вывод в консоль, если она открыта.

anonymous
()
Ответ на: комментарий от ratatosk

Ну а вдруг там какой-то совершенно секретный код =) Это же оборонка...

solovey ★★
()
Ответ на: комментарий от UVV

Он намекает, что Qt4 для оборонной промышленности не прошла сертификацию.

Они такие милые. Чужой хороший код не нужен, а свой быдлокод вроде сабжевого — во все поля. Второй неспециально может устроить больше проблем чем первый — по приказу «потенциального противника» (в военной логике).

buddhist ★★★★★
()
Ответ на: комментарий от UVV

Он намекает, что Qt4 для оборонной промышленности не прошла сертификацию.

o_O

А в 5-ом МСВСе разве не 4-ая версия?

ien
()
Ответ на: комментарий от solovey

Так для этого нужно digia денег дать, причем не мало...

Для оборонки — не обязательно. GPL обязывает выдавать исходники только пользователям. А голых исходников военным маловато.

ien
()
Ответ на: комментарий от ien

Да я хз, я так предположил просто =)

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.