C ++ можно ли использовать макросы для печати функции класса, откуда она вызывается? - PullRequest
0 голосов
/ 15 мая 2019

Предположим, у меня есть определение класса, подобное следующему:

class A {
    void method();
}

Предположим, мне нужно найти, где этот метод вызывается непосредственно из C ++ (т. Е. GDB и компания исключены, поэтому выдает исключение)

Можно наивно определить следующее:

class A {
    //void method();
    void method() { print(__FILE__ + ": " + __LINE__) };
}

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

Если бы вместо ООП наш код был процедурным, однажды он мог бы преобразовать:

void method();

В:

#define method() { print(__FILE__ + ": " + __LINE__) };

Вышеописанное работает, потому что метод не принимает параметров, поэтому его легкопроцессор для изменения всех экземпляров метода на наш новый код отладки.

Однако это не очень общее.С помощью ООП мы можем иметь классы A, B, C и D, которые перезаписывают метод, таким образом, перезаписывая информацию для несвязанных классов.

Даже если только класс A реализует method(), если функция принимает какие-либо параметры, теперь мы получаем новую проблему: method(int i) потребует замены регулярного выражения, так как у нас нет предварительных знаний об именах переменныхоснованный на методе.т. е. шаблон a.method(variable); не может быть статически сопоставлен с помощью константного определения, нам необходимо сопоставить регулярные выражения.

Кто-нибудь знает, можно ли обмануть компилятор в разрешении __FILE__ и __LINE__макросы при вызове, а не определение?

РЕДАКТИРОВАТЬ:

Вопрос, помеченный как дубликат, относится к 2010 году, я думаю, что этот вопрос стоит оставить открытым, 9 лет кажется более чем достаточным временем для новыхвозможные ответы на этот вопрос.

, например, std::experimental::source_location не фигурирует в вопросе.

Я хотел бы, чтобы этот вопрос был вновь открыт

1 Ответ

2 голосов
/ 16 мая 2019

Если вы используете GCC, это было доступно из GCC 4.8:

#include <cstdio>

struct Foo
{
    void debug(const char *file=__builtin_FILE(), int line=__builtin_LINE(), const char *function=__builtin_FUNCTION())
    {
        printf("%s:%d: called from %s\n", file, line, function);
    }
};

int main()
{
    Foo().debug();
}
...