Arhn - архитектура программирования

Как получить имя или файл и строку вызывающего метода?

Есть ли способ в C++11 (используя последнюю версию GCC) получить имя или номер файла и строки метода, вызывающего текущий выполняемый метод (вызывающий)?

Я хочу использовать эту информацию в сообщении об ошибке, когда, например, следующий код не работает:

void SomewhereInMyProgram()
{
    DoSomething(nullptr);
}

void DoSomething(const char* str)
{
    Contract::Requires(str != nullptr);
    // ...
}

В настоящее время у меня есть код, который сообщает об ошибке, возникающей в DoSomething. Хотя технически это верно, я бы хотел, чтобы сообщение об ошибке возникало в SomewhereInMyProgram, где бы оно ни находилось. Это сделало бы мою жизнь намного проще!

Решение может использовать любые функции С++ 11, макросы или специфические вещи GCC, но не то, что мне нужно добавлять на каждом сайте вызова.

Я думаю, что трассировка стека мне не поможет, потому что я не могу использовать обработку исключений. На самом деле я очень ограничен: это автономная среда, в которой недоступны стандартные заголовки C++. Я надеялся на какое-то макро-решение.


class Contract
{
public:
    static void RequiresImpl(bool condition, const char* expression,
        const char* file, int line);

    #define Requires(condition) RequiresImpl(condition, #condition , \
        __FILE__, __LINE__ )
};

  • Похоже, вы ищете трассировку стека во время выполнения, т.е. посмотрите на этот вопрос SO (как они получают трассировку стека) stackoverflow.com/questions/77005/ 08.04.2013
  • @epatel Я не ищу трассировку стека, потому что не могу использовать обработку исключений. Кстати, я точно не задаю тот же вопрос, что и тот, который вы отметили как дубликат? 08.04.2013
  • Я имел в виду, что вы должны заглянуть в функцию handler(), чтобы увидеть, как они получают оттуда трассировку стека, то есть функции backtrace(), backtrace_symbols() и backtrace_symbols_fd(). Попробуйте использовать их в том же месте, где вы хотите, чтобы вызывающий абонент 08.04.2013
  • Отвечает ли это на ваш вопрос? Как получить имя файла и номер строки вызова функции? 30.12.2019

Ответы:


1

Оберните DoSomething в макрос:

void DoSomethingImp(char const *, char const *file, char const *line)
{
    // do whatever needed, use file and line to report problems
}

#define DoSomething(x) DoSomethingImp(x, __FILE__, __LINE__)

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:

Это не лучший способ, люди кричат ​​о макросах WIN API, определенных таким образом для ANSI или UNICODE. Но я считаю, что это единственный способ, если вы не хотите менять каждый вызов DoSomething.

08.04.2013

2

Насколько мне известно, единственный способ АВТОМАТИЧЕСКИ получить информацию о предыдущих вызовах — это использовать обратную трассировку. Этот пост содержит массу информации об этом:

Как создать трассировку стека, когда мое приложение gcc C++ сбои

08.04.2013
  • Прочитав ваши дополнительные требования, я думаю, вам нужно будет использовать что-то вроде этого: stackoverflow.com/questions/5081123/ 08.04.2013

  • 3

    В gcc вы можете использовать один из следующих макросов: __PRETTY_FUNCTION__ или __FUNCTION__ или __func__.

    08.04.2013
  • Это дает имя текущей функции, а не имя или номер строки вызывающей функции. 31.01.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..