Определение вызывающей линии без макроса - PullRequest
1 голос
/ 27 октября 2010

Можно ли определить номер строки, которая вызывает функцию, без помощи макроса?

Рассмотрим этот код:

#include <iostream>

#define PrintLineWithMacro() \
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 4

void PrintLine()
{
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 8
}

int main(int argc, char **argv)
{
  PrintLine();           // Line 13
  PrintLineWithMacro();  // Line 14
  return 0;
}

, который выводит следующее:

Line: 8
Line: 14

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

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

Я бы сделал следующее:

#define PrintLine() PrintLine_(__LINE__)

void PrintLine_(int line) {
    std::cout << "Line: " << line << std::endl;
}

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

1 голос
/ 27 октября 2010

Не переносимо.На любой конкретной платформе вы могли бы в основном повторно реализовать детали отладчика - информация эффективно сохраняется в вашем стеке как адрес возврата.Вы можете добиться такого рода вещей с помощью функции backtrace () на некоторых платформах.

...