Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отладочные сообщения / 12 сообщений из 12, страница 1 из 1
27.04.2013, 13:37
    #38242571
LowCoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
Здравствуйте!


Пишу как водится программу и вот хочется в ней иметь возможность вывода отладочных сообщений на экран которые бы не попали в релизную версию те при определенном символе __DEBUG. Задача вроде тривиальная но видимо я в трех соснах включился в состоянии рейс кондишн :)
Отладочных сообщений очень много так как программа сильно сильно многопоточная и покрывать весь текст программы конструкциям #ifdef __DEBUG std::cout << msg <<msg2 <<endl; #endif как то неаккуратненько – за лесом не будет видно деревьев. А я вот люблю изящество написания… есть такой грешок. Тут еще такое дело что я очень активно пользую операцию << что очень удобно когда нужно выводить сообщение а вселед за ним сразу значения переменных, адреса из и всяко такое.
Пока сделал так



Код: plaintext
1.
2.
3.
4.
5.
#ifdef __DEBUG
#define DBGmsg std::cout << msg << std::endl;
#else
#define DBGmsg ;
#endif





В программе работает

Код: plaintext
1.
2.
3.
4.
main() {
int i = 8;
DBG"Begin to work" &lt;&lt; " and continue and adress i " &lt;&lt; &amp;i
}



Вывод будет
Begin to work and continue and adress i 0xbfac193c
И релиз версия собирается соответственно.

Но гложет меня смутные сомнения, что как то это неаккуратенько. Что можно наверно сделать через шаблоны покрасившее. Потому и спрашиваю – в то время как Александреску бороздит просторы большого театра мы вот все с макросами и те выглядят как то корявенько :) Есть идеи? Ее одно – прога по старому стандарту – не по 11 так что вариадики не предлагать.
...
Рейтинг: 0 / 0
27.04.2013, 15:37
    #38242626
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
LowCoder,

Я думаю то чего вы хотите невозможно. И шаблоны тут не помогут.

Вам нужно еще учесть что бы вывод не только был или не был... А что бы еще и параметры которые вы передаете в лог "не вычислялись" в процессе исполнения (и не компилировались даже). А такое умеют только макросы.

А у макросов проблема когда в них передается нечто содержащие запятую. Но это думаю можно решить с помощью макросов с переменным количеством параметров. В данном случае.

Так что в смысле красоты -- тот или иной фокус с макросами. И можно для красоты не писать макрос БОЛЬШИМИ буквами -- иногда можно и отступить от стандартов.

PS: Хм... хотя по поводу не вычисления параметров можно попробовать сыграть на укороченном вычислении логических выражений? Но не приходит ничего в голову.
...
Рейтинг: 0 / 0
27.04.2013, 15:51
    #38242631
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
LowCoder,

Через макрос, так как вы написали - правильное направление. Ничего там неаккуратного нет.
Разве что надо убрать ";" в обоих вариантах макроса.
Иначе будут проблемы с конструкциями вида
Код: plaintext
1.
2.
3.
4.
if (xxx)
	DBGaaa;
else
	yyy;


Это развернется в:
Код: plaintext
1.
2.
3.
4.
if (xxx)
	cout <<aaa; ;  // двойная ; - else после нее - ошибка компиляции
else
	yyy;
...
Рейтинг: 0 / 0
27.04.2013, 16:15
    #38242638
Отладочные сообщения
petrav И можно для красоты не писать макрос БОЛЬШИМИ буквами -- иногда можно и отступить от стандартов.
Да никто этих стандартов и не придерживается.
Тот же assert реализуется как макрос в том же MSVC11(MSVS2012):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
/***
*assert.h - define the assert macro
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Defines the assert(exp) macro.
*       [ANSI/System V]
*
*       [Public]
*
****/

#include <crtdefs.h>

#undef  assert

#ifdef  NDEBUG

#define assert(_Expression)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

#ifdef  __cplusplus
}
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

#endif  /* NDEBUG */



И используют:
assert(x != y, "My message");
...
Рейтинг: 0 / 0
27.04.2013, 16:29
    #38242648
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
assert как макросДа никто этих стандартов и не придерживается.
Тот же assert реализуется как макрос в том же MSVC11(MSVS2012):

К реализациям стандартных библиотек совсем другие требования по именованию символов, чем к прикладным программам.
Начнем с того что некоторые имена в стандартах прямо заданы (например assert)
...
Рейтинг: 0 / 0
27.04.2013, 16:35
    #38242651
Отладочные сообщения
Anatoly Moskovskyassert как макросДа никто этих стандартов и не придерживается.
Тот же assert реализуется как макрос в том же MSVC11(MSVS2012):

К реализациям стандартных библиотек совсем другие требования по именованию символов, чем к прикладным программам.
Начнем с того что некоторые имена в стандартах прямо заданы (например assert)
А где описан то этот стандарт написания прикладных программ? :)

А assert по другому никак и не сделаешь потому, что он использует __FILE__ и __LINE__.
...
Рейтинг: 0 / 0
27.04.2013, 16:51
    #38242657
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
__FILE__ и __LINE__А где описан то этот стандарт написания прикладных программ? :)

А assert по другому никак и не сделаешь потому, что он использует __FILE__ и __LINE__.
Ну это же просто правила хорошего тона писать макросы заглавными буквами.
Просто иногда это опускают, по тем или иным причинам.
...
Рейтинг: 0 / 0
27.04.2013, 16:52
    #38242659
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
assert как макросИ используют:
assert(x != y, "My message");
Ээээ... А откуда это комментарий-сообщение взялося?
...
Рейтинг: 0 / 0
27.04.2013, 17:01
    #38242665
Отладочные сообщения
petravИ можно для красоты не писать макрос БОЛЬШИМИ буквами -- иногда можно и отступить от стандартов .
petravНу это же просто правила хорошего тона писать макросы заглавными буквами.
Было стандартом, а уже стало правилом хорошего тона? :)
...
Рейтинг: 0 / 0
27.04.2013, 17:51
    #38242689
LowCoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
Благодарю за ответы
интерсно на мой вопрос ответили и тут




кстати еще вопрос а зачем в макросе

Код: plaintext
1.
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )



перед !!(_Expression) два знака !!
...
Рейтинг: 0 / 0
27.04.2013, 17:55
    #38242691
LowCoder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
Сорри недовставил ссылку

На RSDN
...
Рейтинг: 0 / 0
27.04.2013, 18:12
    #38242705
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отладочные сообщения
LowCoderперед !!(_Expression) два знака !!
Возможно у _Expression перегружен 'operator!()'?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отладочные сообщения / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]