janardhan2104 Ответов: 1

Как напечатать только имя функции и класса без возвращаемого типа?


25-01-17 10:37:34 [информация]: |b.cpp| |7| пустота как __cdecl а::Функ(ничтожным) вызов функции
25-01-17 10:37:34 [информация]: |C.cpp| |6| пустота как __cdecl а::func1 из(ничтожным) функцию func1 начать

Мне нужен такой выход:
25-01-17 10: 37: 34 [информация]: |C.cpp| / 6 / A:: Func1 Func1 Start
.СРР
---
не могли бы вы мне помочь?
#include "simpleLogger.h"

namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;

//Defines a global logger initialization routine
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, logger_t)
{
	logger_t lg;

	logging::add_common_attributes();

	logging::add_file_log(
		keywords::file_name = SYS_LOGFILE,
		keywords::rotation_size = 1024 * 1024 * 20,    // megabytes
		keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point (0, 0, 0),
		keywords::auto_flush = true,
		keywords::format = (
		expr::stream << expr::format_date_time <boost::posix_time::ptime> ("TimeStamp", "%d-%m-%y %H:%M:%S")
		<< " [" << expr::attr <boost::log::trivial::severity_level> ("Severity") << "]: "
		<< expr::smessage) );

	logging::add_console_log(
		std::cout,
		keywords::format = (
		expr::stream <<"|"<< expr::format_date_time <boost::posix_time::ptime> ("TimeStamp", "%d-%m-%y %H:%M:%S")<<"|"
		<< " [" << expr::attr <boost::log::trivial::severity_level> ("Severity") << "]: "
		<< expr::smessage	));

	logging::core::get()->set_filter
		(
		logging::trivial::severity >= logging::trivial::info
		);

	return lg;
}


Что я уже пробовал:

#ifndef simpleLogger_h__
#define simpleLogger_h__
#include <crtdefs.h>
#include <boost/log/expressions.hpp>
#include <boost/log/expressions/formatters/named_scope.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup.hpp>
#include <string.h>

#include <boost/log/sinks/debug_output_backend.hpp>
#define FILE (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#define INFO  BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info) << "|" << FILE<< "| " <<" "<<"|"<< __LINE__ << "| "<<__FUNCSIG__

#define WARN  BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::warning) <<  "|" << FILE<< "| " <<" "<<"|"<< __LINE__ << "| "<<__FUNCSIG__
#define ERROR BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::error) <<  "|" << FILE<< "| " <<" "<<"|"<< __LINE__ << "| "<<__FUNCSIG__

#define SYS_LOGFILE   "C:\\Users\\janardhanreddyn\\Documents\\LogFile\\Logfile.log"

//Narrow-char thread-safe logger.
typedef boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger_t;
 
//declares a global logger with a custom initialization
BOOST_LOG_GLOBAL_LOGGER(my_logger, logger_t)
	class A
	{
	public:
	void Func();
    void Func1();
	};
#endif

Philippe Mori

Избегайте использования макросов, когда в этом нет необходимости, и избегайте помещения сложного кода в макросы. Используйте встроенные функции и константы, когда это возможно, и макрос только для той части, где нет альтернативы.

1 Ответов

Рейтинг:
5

Jochen Arndt

Если вам нужно только простое имя функции, используйте __FUNCTION__ вместо __FUNCSIG__.

Видеть Предопределенные Макросы[^] для определенных макросов имен функций [EDIT] с помощью компилятора Microsoft[/EDIT].

[РЕДАКТИРОВАТЬ]
С другими компиляторами проверьте документацию компилятора на наличие предопределенных макросов для имен функций.
Большинство должно обеспечить __func__ макрос, но вы должны проверить, что печатается.
[/РЕДАКТИРОВАТЬ]


janardhan2104

Привет, Йохен, спасибо за ответ.я использовал это функции____ , но когда я скомпилировал программу,получил ошибку как (идентификатор undecleared )

Jochen Arndt

Какой компилятор?
Выше для MS компиляторы. Если вы используете другой вариант, проверьте документацию компилятора. Эти макросы не являются стандартными.
Я обновлю свой ответ.

janardhan2104

я использовал visual studio 2012, даже использовал BOOST_CURRENT_FUNCTION.
я получил тот же результат.
25-01-17 10:37:34 [информация]: |b.cpp| |7| пустота как __cdecl а::Функ(ничтожным) вызов функции
25-01-17 10:37:34 [информация]: |C.cpp| |6| пустота как __cdecl а::func1 из(ничтожным) функцию func1 начать

Jochen Arndt

По моей ссылке он должен быть определен (вы можете изменить версию VS в верхней части страницы).
Он действителен только внутри функции. Но это относится и к __FUNCSIG__.

janardhan2104

Большое вам спасибо за вашу помощь.