预处理器宏和 std::source_location 之间的区别
Difference between preprocessor macros and std::source_location
有一些预定义的预处理器宏(在 C 和 C++ 标准中指定),如 __line__
和 __file__
,它们在预处理期间分别被行号和文件名替换。在 C++20 中,引入了一个新的 class std::source_location
,它或多或少做了同样的事情。
那么,我的问题是...
- 它们有什么区别?
- 它们的优缺点是什么?
- 出于什么原因我应该使用哪一个?
预处理器宏存在于类型系统之外。预处理器宏替换发生在语言的其余部分之外。有关使用预处理器的缺点的全面讨论,请参阅 this answer and this answer。
另一方面,std::source_location
的行为与任何其他 C++ 结构一样。它具有纯值字段,这些字段的类型和行为与该语言中的任何其他值一样。
除此之外,functionality-wise这两种机制是等价的。没有什么是一个人可以实现而另一个人不能完成的(除了 source_location
中的 column field,它在预处理器中没有等价物)。只是新方法更好地实现了它的目标。
有一些预定义的预处理器宏(在 C 和 C++ 标准中指定),如 __line__
和 __file__
,它们在预处理期间分别被行号和文件名替换。在 C++20 中,引入了一个新的 class std::source_location
,它或多或少做了同样的事情。
那么,我的问题是...
- 它们有什么区别?
- 它们的优缺点是什么?
- 出于什么原因我应该使用哪一个?
预处理器宏存在于类型系统之外。预处理器宏替换发生在语言的其余部分之外。有关使用预处理器的缺点的全面讨论,请参阅 this answer and this answer。
另一方面,std::source_location
的行为与任何其他 C++ 结构一样。它具有纯值字段,这些字段的类型和行为与该语言中的任何其他值一样。
除此之外,functionality-wise这两种机制是等价的。没有什么是一个人可以实现而另一个人不能完成的(除了 source_location
中的 column field,它在预处理器中没有等价物)。只是新方法更好地实现了它的目标。