【问题标题】:Difference between preprocessor macros and std::source_location预处理器宏和 std::source_location 之间的区别
【发布时间】:2020-12-07 14:44:36
【问题描述】:

有一些预定义的预处理器宏(在 C 和 C++ 标准中指定)如 __line____file__ 在预处理期间分别替换为行号和文件名。在 C++20 中,引入了一个新类 std::source_location,它或多或少做同样的事情。

所以,我的问题是……

  • 它们之间有什么区别?
  • 它们的优缺点是什么?
  • 出于何种原因我应该使用哪一个?

【问题讨论】:

  • cpp reference 中所述,“旨在使source_location 具有较小的大小并且可以有效地复制。
  • 一个区别是std::source_location 对象在很多事情上不再需要“丑陋”的宏,您可以使用简单的函数(如this example 所示)。

标签: c++ c++20 c++-faq


【解决方案1】:

预处理器宏位于类型系统之外。预处理器宏替换发生在语言的其余部分之外。请参阅this answerthis answer,全面讨论使用预处理器的缺点。

另一方面,

std::source_location 的行为类似于任何其他 C++ 结构。它具有纯值字段,这些字段的类型和行为与该语言中的任何其他值一样。

此外,在功能方面,这两种机制是等效的。没有什么是一个人可以做到的,而另一个人无法做到(除了source_location 中的column field,它在预处理器中没有等效项)。只是新方法更好地实现了它的目标。

【讨论】:

  • 您不能将source_location 行与另一个令牌一起粘贴。 __LINE__ 是一种创建唯一标识符的方法。
  • @n.'pronouns'm.: 有办法在没有 MACRO 的情况下创建唯一标识符。(模板采用 lambda 类型)
  • @Jarod42 那不会是一个标识符;)它在 99% 的时间里都有效,但你不能以这种方式创建枚举。不过,可能还有其他方法可以实现任何特定结果。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2011-05-14
  • 2011-07-07
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
相关资源
最近更新 更多