我正在开发一个日志记录/跟踪单元(请不要指向现有的单元,这是为了获得与结果相同的体验).
要获得运行时调用堆栈跟踪,我们的想法是首先构造一个TraceObject实例,输入一个函数,它携带当前类和函数的信息.有点类似于:
TraceObject to( "MyClass", "myClassFunction" );
Run Code Online (Sandbox Code Playgroud)
TraceObject推送this每个线程堆栈的构造函数,析构函数再次弹出它.因此可以查询堆栈以获得调用堆栈.
我让这个工作满意.但是,有一个小小的飞贼:对象to.根据设计,它永远不会被该名称所引用.因此,它不需要具有名称,尤其是可能与客户端使用的任何标识符冲突的名称(或者,在_前缀的情况下,实现).
TL;博士
是否有可能在堆栈上创建一个匿名的非临时对象(即一个将在函数返回之前生效但没有标识符的对象),如果是,它将如何完成?
没有.
C++中有匿名对象,临时表是表达式的结果,但它们只存在于它们所在语句的上下文中.
如果你真的试图声明一个匿名对象,你会混淆解析器,它会认为你正在声明...一个函数!
但那么,有必要吗?
如果您接受使用宏来实际声明TraceObject,那么对每个跟踪使用宏都很简单; 从而提供那里的阶级和功能.使用__func__或等效,你可以提取类名和函数名(所需的字符串解析位,取决于编译器),并从那里工作.
当然,无论如何,您将为每个跟踪使用宏,因为您可能需要文件名和行号!