Форум программистов, компьютерный форум CyberForum.ru

Вывод отладочной информации - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
01.06.2014, 18:30     Вывод отладочной информации #1
Добрый день

Есть консольная программа которую пишу давольно давно и ее размер уже перевалил за несколько тыс строк. Она изобилует вставками кода с выводом отладочной инфы:

C++
1
2
3
#ifdef _DEBUG
//Тут что-то выводим на консоль с помощью printf()
#endif
Эта конструкция меня устраивала до тех пор пока не исчезла возможность просматривать вывод на консоль и я
решил что нужно делать логирование в файл.
Я бы набросал ее и отруки, а в асходниках автоматом бы заменил printf() на самописный Log(), но колво параметров
у printf() не постоянно, а функцию хотел бы оформить как макрос с переменным колвом параметров.

Мне кажется что пытаюсь изобрести велосипед.
Может есть стандартные решения?
Спасибо
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2014, 18:30     Вывод отладочной информации
Посмотрите здесь:

C++ вывод на экран информации
C++ Вывод информации в С++
C++ Вывод информации в 1 строке
C++ класс. вывод информации
C++ ввод-вывод информации на с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 18:48     Вывод отладочной информации #2
А зачем вообще использовать printf? вы же в разделе C++ тему создали, используйте std::ofstream, связанный с файлом и выводите сколько угодно параметров разных типов.
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
01.06.2014, 18:57     Вывод отладочной информации #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от hknower Посмотреть сообщение
я решил, что нужно делать логирование в файл, но кол-во параметров у printf() не постоянно
Есть функция, аналогичная printf, но для вывода в файл: fprintf - оно ?
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
01.06.2014, 19:06  [ТС]     Вывод отладочной информации #4
точно оно)) только об этом подумал)) можно с пом fprintf как-нибудь выводить на и консоль и в файл?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
01.06.2014, 19:13     Вывод отладочной информации #5
Цитата Сообщение от hknower Посмотреть сообщение
можно с пом fprintf как-нибудь выводить на и консоль
C++
1
fprintf(stdout,.....);
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
01.06.2014, 19:14     Вывод отладочной информации #6
Цитата Сообщение от hknower Посмотреть сообщение
можно с пом fprintf как-нибудь выводить на и консоль и в файл?
Возможно не лучшее решение, но можно использовать что-то вроде этого:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
#define _DEBUG         // определяем _DEBUG
#define _DEBUG_CONSOLE // определяем _DEBUG_CONSOLE
#define _DEBUG_FILE    // определяем _DEBUG_CONSOLE
 
int main()
{
 
#ifdef _DEBUG // если определен _DEBUG, то заходим внутрь
    #ifdef _DEBUG_CONSOLE // если определен _DEBUG_CONSOLE, то заходим внутрь
        // и печатаем в консоль
    #endif
    #ifdef _DEBUG_FILE    // если определен _DEBUG_FILE, то заходим внутрь
        // и печатаем в файл
    #endif
#endif
    return 0;
}
Стоит учитывать, что некоторые среды разработки сами определяют _DEBUG, при конфигурации сборки Debug, то-есть строка
C++
1
#define _DEBUG         // определяем _DEBUG
скорее всего не понадобится. Определением или комментированием оставшихся двух макросов мы регулируем куда выводить или не выводить.

P.S. Вообще всех проблем можно избежать, если пользоваться встроенным отладчиком в среду разработки. Часто это оказывается намного лучше отладочной печати. Тут вам и отслеживание переменных в определенный момент времени, и состояние памяти, и состояние регисторов процессора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2014, 19:46     Вывод отладочной информации
Еще ссылки по теме:

C++ Графический вывод информации
C++ Проект не содержит отладочной информации
C++ Вывод информации об абонентах

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
01.06.2014, 19:46  [ТС]     Вывод отладочной информации #7
Ну чтоб уж совсем было готовое решение:
Как определить эту конструкцию в макрос:
C++ (Qt)
1
2
3
4
5
6
7
8
#ifdef _DEBUG // если определен _DEBUG, то заходим внутрь
    #ifdef _DEBUG_CONSOLE // если определен _DEBUG_CONSOLE, то заходим внутрь
        // и печатаем в консоль
    #endif
    #ifdef _DEBUG_FILE    // если определен _DEBUG_FILE, то заходим внутрь
        // и печатаем в файл
    #endif
#endif
чтоб однажды настроив где-нибудь stdafx.h можно было бы вызывать с переменным колвом параметров, а не втыкать это добро каждый раз при выводе в файл/консоль?

Добавлено через 15 минут
Тут думаю можно обойтись без макроса с переменным кол-вом переменных, и ввести функцию с переменным кол-вом переменных:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Log(params)
{
 
#ifdef _DEBUG // если определен _DEBUG, то заходим внутрь
char tmp_str[MAX_STR_LEN];
sprintf(tmp_str , "%s..." ,params);
    #ifdef _DEBUG_CONSOLE // если определен _DEBUG_CONSOLE, то заходим внутрь
        // и печатаем в консоль
        fprintf(stdout , "%s" , tmp_str);
    #endif
    #ifdef _DEBUG_FILE    // если определен _DEBUG_FILE, то заходим внутрь
        // и печатаем в файл
        fprintf(file_fd , "%s" , tmp_str);
    #endif
#endif
 
}
Yandex
Объявления
01.06.2014, 19:46     Вывод отладочной информации
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru