假设我有一个这样的类定义:
class A {
void method();
}
假设我需要找到直接从C ++调用此方法的位置(即gdb和company被淘汰,因此抛出异常)
一个人可以天真地定义以下内容:
class A {
//void method();
void method() { print(__FILE__ + ": " + __LINE__) };
}
但是,这将打印当前方法的文件和行,而不是打印该方法所在的文件和行。
如果我们的代码不是OOP程序,则可以转换一次:
void method();
收件人:
#define method() { print(__FILE__ + ": " + __LINE__) };
以上方法之所以有效,是因为方法不带任何参数,因此处理器可以轻松地将方法的所有实例更改为我们的新调试代码。
但是,这不是很普遍。使用OOP,我们可以使类A,B,C和D都覆盖该方法,从而为不相关的类覆盖信息。
即使仅A类实现了method()
,如果函数采用任何参数,现在我们也会遇到一个新问题:method(int i)
将需要替换正则表达式,因为我们不了解变量名称沉入方法中。即模式a.method(variable);
无法通过常量定义静态匹配,我们需要匹配正则表达式。
有人知道是否有可能欺骗编译器在调用时解析__FILE__
和__LINE__
宏而不是定义?
编辑:
标记为重复的问题是从2010年开始的,我认为有必要将此问题公开,因为9年的时间似乎足以为该问题提供新的可能答案。
例如std::experimental::source_location
不在问题中。
我希望这个问题再次出现
答案 0 :(得分:2)
如果您使用的是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();
}