【发布时间】:2021-10-15 23:35:23
【问题描述】:
某些 C++ feature test macros(例如 __cpp_lib_three_way_comparison)需要包含标头(例如 <compare>)来测试它们。
这似乎很倒退,例如也许我只想在我知道编译器支持头文件时才包含头文件(更准确地说是它使用的编译器+标准库 impl),例如假设我有my_fancy_string_view,如果std::string_view 可用,我想将其键入std::string_view,但要检测std::string_view 是否可用,我需要包含<string_view>...
这只是此功能设计中的“错误/糟糕”,还是编译器未预定义所有功能测试宏是否有充分的理由?我的猜测是可能允许混合 STL 实现,例如clang 在某些平台上使用 gcc 的 std lib 实现,但我再次假设编译器知道他们使用哪些 std lib 实现,因此他们可以调整预定义的宏。
我知道 <version> 标头存在,但这对我没有帮助,因为它仅在 C++20 中添加。
当我的基线是 C++20 时,它可能会在 10 多年后变得很好,但现在它不是那么有用。
此外,添加此标头的事实可能表明实际上要求“重”包含是一个错误,但我想就此获得专家意见。
附: This 是添加了<version> 的提案,但它非常小,所以没有细节......
【问题讨论】:
-
C++17 有
__has_include来检查头文件是否存在。 -
您希望编译器预定义标准库中的所有功能测试宏吗?其中一些功能将基于编译器版本?对于那些库实现依赖于语言特性的库特性(例如,三路比较),这将如何工作?
-
编译器知道它会使用什么标准库,对吧? 实际上,不知道。例如,请参阅stackoverflow.com/questions/14972425/…
-
当然,但我不认为编译器“知道”
libc++和libstdc++之间的所有详细差异。那要求太高了。此外,库开发人员希望能够独立于编译器开发人员进行更改。