C++ Qt/C+中的反射+;

C++ Qt/C+中的反射+;,c++,debugging,qt,reflection,logging,C++,Debugging,Qt,Reflection,Logging,我刚开始使用Qt,发现QMetaObject在我看来非常好/方便 现在我想知道是否可以用Qt/Cudio C++或其他C++库获得当前函数名、调用函数名或当前堆栈等信息。 我需要这个用于调试/记录目的 例如,在C语言中,您可以调用MethodBase.GetCurrentMethod()来获取当前方法。这样做非常方便。有一个宏PRETTY_函数返回一个格式良好的函数名。 它可以在GCC和其他一些编译器中使用。有一个宏PRETTY_函数,它返回一个格式良好的函数名。 它可以在GCC中使用,也可以是

我刚开始使用Qt,发现QMetaObject在我看来非常好/方便

现在我想知道是否可以用Qt/Cudio C++或其他C++库获得当前函数名、调用函数名或当前堆栈等信息。 我需要这个用于调试/记录目的


例如,在C语言中,您可以调用
MethodBase.GetCurrentMethod()
来获取当前方法。这样做非常方便。

有一个宏PRETTY_函数返回一个格式良好的函数名。
它可以在GCC和其他一些编译器中使用。

有一个宏PRETTY_函数,它返回一个格式良好的函数名。
它可以在GCC中使用,也可以是其他编译器。

< P>不认为C++可以做到这一点。我认为您要做的是创建一个日志宏,它使用:


不要认为C++可以做到这一点。我认为您要做的是创建一个日志宏,它使用:


如果您绝对想做这类事情(并且您的编译器支持),可以在编译器中启用RTTI。但是在C++设计的原始设计(Prime98)中,在运行时不定义任何“元”数据。


如果仅用于日志记录,请使用编译器定义的宏(如FILELINE)。如果你想在运行时做更高级的事情,我认为制作你自己的“元数据”系统可能是一个更好的计划(或者在网上寻找一个现有的系统)。

如果你绝对想做这类事情,你可以在你的编译器中启用RTTI(并且你的编译器支持它)。但是在C++设计的原始设计(Prime98)中,在运行时不定义任何“元”数据。


如果仅用于日志记录,请使用编译器定义的宏(如FILELINE)。如果你想在运行时做更高级的事情,我认为制作你自己的“元数据”系统可能是一个更好的计划(或者在网上寻找一个现有的系统)。

没有独立于平台的方法可以做到这一点。可悲的是(或者幸运的是,这取决于您的观点),标准C/C++不包含这些内省功能

下面和其他地方讨论了获取堆栈跟踪的各种方法

您可能需要调试符号信息才能获得任何有意义的堆栈跟踪,而您可能不希望在客户的系统上安装这些跟踪

如果您确实想知道Windows上日志项的堆栈而不安装符号信息,则可以编写一个小型转储文件(MiniDumpWriteDump)。这可以不使用符号保存在客户的系统上,然后使用该构建的.pdb符号在开发人员的系统上进行分析。这还将显示局部变量值,并且可以选择包含所有流程数据(这使得迷你转储文件非常庞大)。更多信息请参见下文和Internet上的其他地方


没有独立于平台的方法来实现这一点。可悲的是(或者幸运的是,这取决于您的观点),标准C/C++不包含这些内省功能

下面和其他地方讨论了获取堆栈跟踪的各种方法

您可能需要调试符号信息才能获得任何有意义的堆栈跟踪,而您可能不希望在客户的系统上安装这些跟踪

如果您确实想知道Windows上日志项的堆栈而不安装符号信息,则可以编写一个小型转储文件(MiniDumpWriteDump)。这可以不使用符号保存在客户的系统上,然后使用该构建的.pdb符号在开发人员的系统上进行分析。这还将显示局部变量值,并且可以选择包含所有流程数据(这使得迷你转储文件非常庞大)。更多信息请参见下文和Internet上的其他地方


我发现
\uuu func\uu
是获取函数名的C99标准<代码>\uuuu函数\uuuu应该也适用于大多数编译器
\uuuu PRETTY\u FUNCTION\uuuu
Q\u FUNC\u INFO
都可以使用Qt并返回函数签名,但并非所有操作系统都是如此。我发现
\uuu FUNC\uuu
是C99获取函数名的标准<代码>\uuuu函数\uuuu应该也适用于大多数编译器
\uuuu PRETTY\u FUNCTION\uuuuuu
Q\u FUNC\u INFO
都可以使用Qt并返回函数签名,但可能并非所有操作系统都是这样。StackWalker看起来很有希望,但是否可以与Qt一起使用?StackWalker应该适用于Qt,但仅适用于Windows。堆栈遍历特定于操作系统和编译器,而不是您正在使用的任何库(如Qt)。StackWalker看起来很有前途,但它是否可以与Qt一起使用?StackWalker应该适用于Qt,但仅适用于Windows。Stand St行走是OS和编译器的具体操作,而不是你所使用的任何库(比如QT)。RTTI是官方C++标准(旧的和新的)的一部分,默认情况下大多数编译器都启用了。不支持RTTI的编译器是不一致的。也就是说,RTTI有时会被改变,特别是在嵌入式开发中,应该使用“设计”这个词而不是“标准”,您是正确的,我是正确的。RTTI是官方C++标准(旧和新)的一部分,并且在大多数编译器上默认启用。不支持RTTI的编译器是不一致的。这就是说,RTTI有时会被抛弃,特别是在嵌入式开发中,我们应该使用“设计”这个词而不是“标准”你是对的,我是对的。
__FUNCTION__ __LINE__ __FILE__