C++ 堆栈上的匿名对象,用C++;?
我正在使用一个日志/跟踪单元(请不要指向现有的单元,这是为了体验,也是为了结果) 为了获得运行时调用堆栈跟踪,我们的想法是在输入函数的第一件事上构造一个C++ 堆栈上的匿名对象,用C++;?,c++,C++,我正在使用一个日志/跟踪单元(请不要指向现有的单元,这是为了体验,也是为了结果) 为了获得运行时调用堆栈跟踪,我们的想法是在输入函数的第一件事上构造一个TraceObject实例,它携带当前类和函数的信息。有点类似于: TraceObject to( "MyClass", "myClassFunction" ); TraceObject的构造函数将this推送到每个线程堆栈上,析构函数再次弹出它。因此,可以查询调用堆栈的堆栈 我对这项工作很满意。但是,有一个小飞贼:对象到。根据设计,它永远不会
TraceObject
实例,它携带当前类和函数的信息。有点类似于:
TraceObject to( "MyClass", "myClassFunction" );
TraceObject
的构造函数将this
推送到每个线程堆栈上,析构函数再次弹出它。因此,可以查询调用堆栈的堆栈
我对这项工作很满意。但是,有一个小飞贼:对象到。根据设计,它永远不会被称为那个名字。因此,它不需要有名称,至少不需要有可能与客户机使用的任何标识符冲突的名称(或者,在\uu
前缀的情况下,实现)
tl;dr
是否可以在堆栈上创建一个匿名的非临时对象(即,在函数返回之前一直存在,但没有标识符的对象),如果可以,将如何创建?正如我在评论中所说,不能使用范围有限的匿名变量
#define BEGIN_LOG TraceObject abcdefghij( "", __func__ );
void Function(){
BEGIN_LOG;
//bla bla
}
这应该可以做到,只要有一个编译器宏来获取类名
编辑:如果用一种简单的方法来获取类名,那就不太可能了,你可能需要做一些类似于在上所建议的事情。或者只需使用\uuuuuuu文件
编辑:您可能需要尝试\uuuuu func\uuuuu
和\uuuu FUNCTION\uuuuu
以查看其中一个或两个是否按您的要求工作。C++标准也没有指定。 < P> <强> NO./Sturi>< /P>
< C++中有匿名对象,临时变量是表达式的结果,但是它们只存在于它们所声明的上下文中。
如果你真的试图声明一个匿名对象,你会混淆解析器,它会认为你在声明。。。一个函数
但是,有必要吗
如果您接受使用宏来实际声明跟踪对象
,那么为每个跟踪使用宏就很简单;从而在那里提供类和函数。使用\uuuu func\uuuu
或等效工具,您可以提取类名和函数名(需要字符串解析位,具体取决于编译器)并从中进行操作
当然,对于每个跟踪,您都将使用宏,因为您可能需要文件名和行号 一些行号的东西:
#define XPASTE(arg1, arg2) PASTEX(arg1, arg2)
#define PASTEX(arg1, arg2) arg1 ## arg2
#define TRACELOG() \
TraceObject XPASTE(trace_object, __LINE__)
我认为严格来说这是不可能的,但是用一个宏和一个模糊的名字,你可以达到同样的效果。有没有一个合理的理由让你需要它是无名的,或者它更像是一个“它不是真正需要的”东西。@KarthikT:是的,一个包装器宏是一般的想法。我只是想知道我是否可以去掉“晦涩”而实现“不可见”。@Karthik T确切地说,boost log也是这样做的,所以我的猜测是:几年前,虚幻SDK没有其他类似的方式,但也包含了一个try/catch块。这个名字是由一个宏和类的函数名组成的,还有一些其他的位,如果我没有记错的话,我认为没有一个丑陋的宏哈克是不可能的。AFAIK,<代码>函数,函数>代码>不是C++的标准,只是C,或者是用C++ 11改变了吗?您可以使用const reference延长临时对象的生存时间,但const reference inself是临时对象的另一个名称:const T&r=T()@AnatolyS:const引用或rvalue引用(在C++11中),但是,正如您所指出的,它引入了一个标识符。我不喜欢\uuu func\uu
的实现定义方式。但是,如果你真正回答了这个问题,即匿名对象是否可能(“否”)。-)@DevSolar:我必须承认,我真的很想有一种方法以标准方式获得类名和函数名。我也不太喜欢\uuuuu func\uuuu
,通常我会将它传递给一个函数,该函数是专门为解析其输出和提取函数名而定义的,该函数是以依赖于编译器的方式定义的。@MatthieuM.:ACK。事实上,我很惊讶地发现这在C++11中没有得到纠正…添加\uuuu LINE\uuuu
不会带来太多的混淆,但至少在创建第二个TraceObject
时可以避免“隐藏”警告。。。