提问人:Akib Azmain Turja 提问时间:9/1/2020 最后编辑:Akib Azmain Turja 更新时间:12/7/2020 访问量:314
预处理器宏和 std::source_location 之间的区别
Difference between preprocessor macros and std::source_location
问:
有一些预定义的预处理器宏(在 C 和 C++ 标准中指定),例如 和,它们在预处理期间分别替换为行号和文件名。在 C++20 中,引入了一个新类,它或多或少地做同样的事情。__line__
__file__
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% 的时间内工作,但例如,您不能以这种方式创建枚举。不过,可能还有其他方法可以实现任何特定结果。
评论
std::source_location