预处理器宏和 std::source_location 之间的区别

Difference between preprocessor macros and std::source_location

提问人:Akib Azmain Turja 提问时间:9/1/2020 最后编辑:Akib Azmain Turja 更新时间:12/7/2020 访问量:314

问:

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

所以,我的问题是......

  • 它们之间有什么区别?
  • 它们的优点和缺点是什么?
  • 出于什么原因我应该使用哪一个?
C ++20 C ++-常见问题

评论

0赞 Tom 9/1/2020
正如 cpp 参考资料中所述,“旨在使source_location具有较小的尺寸并且可以有效地复制。
0赞 Some programmer dude 9/1/2020
一个区别是,对于对象,你不再需要“丑陋”的宏来做很多事情,你可以使用简单的函数(如本例所示)。std::source_location

答:

4赞 ComicSansMS 9/1/2020 #1

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

std::source_location另一方面,其行为与任何其他 C++ 结构类似。它具有键入的纯值字段,其行为与语言中的任何其他值类似。

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

评论

1赞 n. m. could be an AI 9/1/2020
不能将行粘贴到另一个标记上。有了它,就有了它,就可以创建唯一标识符了。source_location__LINE__
0赞 Jarod42 9/2/2020
@n.'pronouns'm.:有一些方法可以在没有 MACRO 的情况下创建唯一标识符。(使用 lambda 获取模板类型)
1赞 n. m. could be an AI 9/2/2020
@Jarod42 那不会是标识符;)它在 99% 的时间内工作,但例如,您不能以这种方式创建枚举。不过,可能还有其他方法可以实现任何特定结果。