问题描述
有一些预定义的预处理器宏(在C和C ++标准中指定),例如__line__
和__file__
,它们在预处理期间分别由行号和文件名替换。在C ++ 20中,引入了一个新的类std::source_location
,它或多或少地完成相同的工作。
所以,我的问题是...
- 它们之间有什么区别?
- 它们的优缺点是什么?
- 出于哪个原因我应该使用哪个?
解决方法
预处理器宏位于类型系统之外。预处理程序宏替换发生在该语言的其余部分之外。有关使用预处理器的缺点的全面讨论,请参见this answer和this answer。
另一方面, std::source_location
的行为与任何其他C ++结构一样。它具有简单的值字段,这些字段的类型和行为与语言中的其他任何值一样。
此外,在功能上,这两种机制是等效的。除了source_location
中的column field(在预处理器中没有等效功能)之外,其他任何人都无法做到。只是新方法可以更好地实现其目标。