Могу ли я получить доступ к имени вызывающей функции программно? - PullRequest
3 голосов
/ 30 января 2011

Я надеюсь добавить немного функциональности в систему файлов журнала для проекта, над которым я работаю.Для моих вызовов LogError() я хотел бы включить функцию, в которой произошла ошибка. Мне интересно, есть ли способ, которым я могу получить доступ к имени функции, которая вызвала LogError(), чтобы я мог программно получить доступ к этой информации, чтобы добавитьэто в журнал.

Например:

bool Engine::GraphicsManager::Initialize(const HWND i_hWindow_main)
{
    if ( !InitializeWindow( i_hWindow_main ) )
    {
        Engine::LogManager::Instance().LogError(L"GraphicsManager::Initialize - Unable to initialize graphics window");
        return false;
    }
    Engine::LogManager::Instance().LogMessage(L"Graphics window initialized successfully");

    /* SNIP */

    initialized = true;
    return true;
}

В приведенном выше примере я бы хотел, чтобы LogError() смог определить, что он был вызван из GraphicsManager::Initialize(), и вывести(по крайней мере, часть) имени этой функции вместо того, чтобы вводить его везде вручную.

РЕДАКТИРОВАТЬ: Я должен был упомянуть, что моя LogError() функция (и другие функции ведения журнала)по существу, оболочки для vfwprintf_s(), поэтому они могут принимать списки аргументов переменной длины.Хотя мне нравятся предложения "использовать макрос", я не уверен, как решить эту потенциальную проблему (что, вероятно, является другим вопросом).

Это все еще разумно / возможно?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 30 января 2011

Вы можете добавить аргумент для имени функции и передать в макрос __FUNCTION__: http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx

И вы также можете определить макрос, который автоматически заменит ...log...() на ...log...(__FUNCTION__).

1 голос
/ 30 января 2011

Это предопределенные макросы и часть стандарта C / C ++, которые вы можете использовать:

__FILE__ __LINE__

Они объяснены здесь

0 голосов
/ 30 января 2011

Создайте макрос ведения журнала

РЕДАКТИРОВАТЬ: Некоторые исправления для работы с широкими символами

//support macros
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define STRINGIZE(x) #x
#define __WFILE__ WIDEN(__FILE__)
#define __WFUNCTION__ WIDEN(__FUNCTION__)
#define __WLINE__ WIDEN( STRINGIZE(__LINE__) )
// logging macro
#define LOG(msg) Engine::LogManager::Instance().LogError(__WFILE__ L"::" __WFUNCTION__ L":" __WLINE__ L" - " msg)

Используйте это как

if( error ) { LOG(L"Error!"); }

logs

File.cpp::Function:Line - Error!

Это работает с использованием конкатенации строк в стиле C.«aa» «bb» -> «aabb» вместе с некоторым оператором вставки, чтобы поставить L перед "astring".Он использует макросы __FILE__, __FUNCTION__ и __LINE__, чтобы сообщить, откуда произошла ошибка.__LINE__ переводится в строку с макросом STRINGIZE.Из-за дрянного соответствия стандарту рекомендуется BOOST_PP_STRINGIZE, если вы все равно планируете использовать повышение.

...