【问题标题】:Reflection in Qt/C++Qt/C++ 中的反射
【发布时间】:2011-07-26 18:34:39
【问题描述】:

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

现在我想知道是否可以使用 Qt/标准 C++ 或任何其他 C++ 库获取当前函数名称、调用函数名称或当前堆栈等信息。

我需要这个来进行调试/记录。

例如,在 C# 中,您可以调用 MethodBase.GetCurrentMethod() 来获取当前方法。这样的东西真的很方便。

【问题讨论】:

    标签: c++ debugging qt reflection logging


    【解决方案1】:

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

    【讨论】:

    • 我发现__func__是获取函数名的C99标准。 __FUNCTION__ 也应该适用于大多数编译器。 __PRETTY_FUNCTION__Q_FUNC_INFO 都适用于 Qt 并返回函数签名,但并非所有操作系统都如此。
    【解决方案2】:

    不要认为你可以在 C++ 中做到这一点。我认为您要做的是创建一个使用predefined macros 的日志记录宏:

    __FUNCTION__ __LINE__ __FILE__
    

    【讨论】:

      【解决方案3】:

      没有独立于平台的方式来做到这一点。遗憾的是(或幸运的是,取决于您的观点)标准 C/C++ 不包括那些自省能力。

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

      How can one grab a stack trace in C?

      您可能需要调试符号信息来获取您可能不想安装在客户系统上的任何有意义的堆栈跟踪。

      如果您真的想在没有安装符号信息的情况下了解 Windows 上日志条目的堆栈,那么您可以编写一个小型迷你转储文件 (MiniDumpWriteDump)。这可以在没有符号的情况下保存在客户的系统上,然后在开发人员的系统上使用该构建的 .pdb 符号进行分析。这也将显示局部变量值,并且您可以选择包含所有过程数据(这使得迷你转储文件很大)。更多信息请见下方和互联网上的其他地方。

      http://blogs.msdn.com/b/joshpoley/archive/2008/05/19/prolific-usage-of-minidumpwritedump-automating-crash-dump-analysis-part-0.aspx

      【讨论】:

      • StackWalker 看起来很有前途,但有可能与 Qt 一起使用吗?
      • StackWalker 应该适用于 Qt,但仅适用于 Windows。堆栈遍历特定于操作系统和编译器,而不是您碰巧使用的任何库(如 Qt)。
      【解决方案4】:

      如果您绝对想做这种事情(并且您的编译器支持它),您可以在编译器中启用 RTTI。但在 C++ 标准(98 之前)的原始设计中并没有在运行时定义任何“元”数据。

      http://en.wikipedia.org/wiki/Run-time_type_information

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

      【讨论】:

      • RTTI 是官方 C++ 标准(旧的和新的)的一部分,在大多数编译器上默认启用。不支持 RTTI 的编译器是不符合标准的。也就是说,RTTI 有时会被关闭,尤其是在嵌入式开发中
      • 应该用“设计”这个词而不是“标准”你是对的,我是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多