powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отладочные сообщения
12 сообщений из 12, страница 1 из 1
Отладочные сообщения
    #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
Отладочные сообщения
    #38242626
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LowCoder,

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

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

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

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

PS: Хм... хотя по поводу не вычисления параметров можно попробовать сыграть на укороченном вычислении логических выражений? Но не приходит ничего в голову.
...
Рейтинг: 0 / 0
Отладочные сообщения
    #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
Отладочные сообщения
    #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
Отладочные сообщения
    #38242648
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assert как макросДа никто этих стандартов и не придерживается.
Тот же assert реализуется как макрос в том же MSVC11(MSVS2012):

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

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

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

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




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

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



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

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


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