首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++23 stacktrace_entry和source_location不同?

为什么C++23 stacktrace_entry和source_location不同?
EN

Stack Overflow用户
提问于 2022-02-02 08:43:00
回答 2查看 310关注 0票数 8
代码语言:javascript
复制
class stacktrace_entry {
public:
  string description() const;
  string source_file() const;
  uint_least32_t source_line() const;
  /* ... */
};
代码语言:javascript
复制
struct source_location {
  // source location field access
  constexpr uint_least32_t line() const noexcept;
  constexpr uint_least32_t column() const noexcept;
  constexpr const char* file_name() const noexcept;
  constexpr const char* function_name() const noexcept;
  /* ... */
};

它们的用途基本相同,为什么它们有不同之处,特别是在stacktrace_entry中没有列,或者甚至没有共享同一个类?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-02 20:21:20

提案作者的答案。

关于返回std::string

正如P0881R7中所述:“不幸的是,在某些平台上,获取源代码行需要分配,或者源文件名为重归是存储由用户提供。”

关于栏:

大多数流行的非Windows平台解决方案都不提供source_column()。目前,std::stacktrace是所有平台的最小能力子集,因此缺少列。这一点以后可以更改,对于C++标准化来说,添加看起来相当简单。

票数 1
EN

Stack Overflow用户

发布于 2022-02-02 08:58:02

它们的用途基本相同,

它们的用途不同:如果说有什么不同的话,那就是整个source_location提供了特定的编译时信息,而这些信息恰好是stacktrace_entry更广泛的用例的一个小子集(特别是它的source_file查询成员函数)。

P0881R7 (添加堆栈跟踪库的建议)引入了范围更大的堆栈跟踪库,或者在运行时提供有关调用序列的详细信息:

在当前的工作草案N4741中,没有获取、存储和解码当前调用序列的方法。这样的调用序列对于调试和死后调试非常有用。..。 本文提出的类可以简化调试,并可以将断言消息更改为以下内容: 性能说明:在Boost.Stacktrace开发阶段,许多用户请求一种快速存储堆栈跟踪的方法,而不对函数名进行解码。本文保留了这一功能。所有的stack_frame函数和构造函数都是惰性的,如果没有来自类用户的显式请求,则不会解码指针信息。

P1208R6 (采用source_location for C++20)引入了范围更窄的source_location,特别是提供了关于源代码的某些信息作为编译时信息。

对P0881的审查提供了SG16关于库之间重叠的一些反馈:

SG16讨论了许多选项,包括source_file()返回std::filesystem::path的可能性。SG16总结了以下建议:“对齐行为与source_location;删除有关转换的措辞;字符串内容是实现定义的。”不反对一致同意。

但是,将重点放在stacktrace_entry类的stacktrace_entry查询函数上,使其与整个source_location保持一致。再次强调的是,stacktrace_entry具有更广泛的用途,即source_location的狭义编译时信息(如上面所述,可视为stacktrace_entry信息的子集)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70952646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档