Есть ли способ в 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__ )
};