【问题标题】:Print instantiation chain打印实例化链
【发布时间】:2012-05-10 22:10:48
【问题描述】:

我正在使用 STL C++0x 容器调试一些 C++ 解析器(工具链是 GCC 4.7.0)。

而且由于 STL 重新绑定代码很难理解,我需要以某种方式打印类型定义的完整实例化链,例如 std::vector<T>::reference。当然,它只解析为T&,但在经过__gnu_cxx 和其他内部结构中的至少7 个不同模板之前。

所以我期待在出现模板错误的情况下打印的内容,但是对于编译器实例化的 every 类。 可能吗? GCC 插件,也许...

UPD:嗯,我已经手动实例化了所有需要的模板。似乎没有什么好的方法可以自动执行此操作,除了在 GCC 代码本身中插入一些调试 printf 语句。

【问题讨论】:

  • 你试过STLFilt:bdsoft.com/tools/stlfilt.html>吗?尽管最初是为了帮助您解决与模板实例化相关的错误而开发的(并且在“概念”之前——尽管它们还没有作为标准的一部分),但它可能值得您花时间。我不认为他们有 C++11 特定的变化,因为积极的开发停止了一段时间。否则,您将不得不编写自己的各种模板编译器。
  • 您是否从源代码构建 GCC?我似乎记得很多调试转储选项,您可能能够获得每个模板实例化的状态消息。不过,它可能涉及绕过驱动程序。

标签: c++ debugging instantiation typename


【解决方案1】:

由于您使用的是 GCC 4.7,我假设您在一个可以针对您的代码运行 clang 的系统上。 Clang 的错误消息,特别是模板非常好。

模板 类示例{ 示例(常量 T& t):t_(t) {} T&T_; }; 诠释一个; 示例 e(a);

输出:

t.cpp:8:14:错误:调用类“示例”的私有构造函数 示例 e(a); ^ t.cpp:3:5: 注意:这里隐式声明为私有 示例(常量 T& t):t_(t) {} ^ t.cpp:3:27:错误:对类型“int”的引用绑定到类型“const int”的值会下降 限定词 示例(常量 T& t):t_(t) {} ^ ~ t.cpp:8:14:注意:在此处请求的成员函数“Example::Example”的实例化中 示例 e(a); ^ 产生 2 个错误。

【讨论】:

  • GCC 4.7如何隐含Clang,问题涉及代码没有错误。
  • 啊,我把它误读为“我需要一些模板代码提供更好的错误消息。”
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2023-03-31
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多