Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆栈上的匿名对象,用C++;?_C++ - Fatal编程技术网

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
时可以避免“隐藏”警告。。。