预处理器宏和 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,它在预处理器中没有等价物)。只是新方法更好地实现了它的目标。