预处理程序宏和std :: source_location之间的区别 所以,我的问题是...

问题描述

有一些预定义的预处理器宏(在C和C ++标准中指定),例如__line____file__,它们在预处理期间分别由行号和文件名替换。在C ++ 20中,引入了一个新的类std::source_location,它或多或少地完成相同的工作。

所以,我的问题是...

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

解决方法

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

另一方面,

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

此外,在功能上,这两种机制是等效的。除了source_location中的column field(在预处理器中没有等效功能)之外,其他任何人都无法做到。只是新方法可以更好地实现其目标。