不同的C ++编译器在不同的时间点实现各种语言功能(例如,参见clang C ++ status和gcc c ++ status;同样适用于其他编译器)。 在创建C ++库时,通常需要支持最新功能以改善用户体验。 当支持新功能而不是在任何地方实现的公共子集时,了解编译器支持哪些功能而不必为每个编译器支持一组版本号是有帮助的。
是否有合理标准化的功能测试集可以在编译时用于确定编译器是否支持特定的语言功能?
对于声誉很高的人来说,这是一个非常糟糕的问题。 这是非常自以为是的。
@EdHeal从实际角度来看也非常重要
可能已经被程序员回答了.stackexchange.com / items / 199708 /
@EdHeal:问题可能有一定程度的意见。 我也认为有一个完全中立的答案。
@PeterM:虽然我看了,但我没有在那里找到问题。 奇怪的是,它也被认为是偏离主题的 - 也许它在这里是主题。
我所做的只是谷歌c++ compiler test suite,这是最重要的链接
第二个链接是opengroup.org/testing/testsuites/perenial.htm
您可能无法比Boost.Config库做得更好。它定义了各种C ++ 11和C ++ 14特性的预处理器宏,这些特性在VC ++等C ++ 11/14-ish编译器上并不普遍支持。它就像你要达到标准一样接近。
IIRC,它与autoconf类似,通过预建(并在必要时执行)一堆简单的测试程序。我不认为你会得到任何完全在编译时运行的东西,只是因为在一个实现中存在关键字,而在另一个实现中存在语法错误。
这个答案是一般定理的必然结果,如果你有C ++问题,首先看看Boost是否有答案。
"IIRC,它与autoconf类似,通过预建(并在必要时执行)一系列简单的测试程序。" 不,Boost.Config实际上是完全编译时,每个编译器,标准库和平台配置使用版本检测宏来选择性地启用随后通过宏而不是关键字使用的功能。
我没有尝试使用这些建议,但在C ++委员会会议上,功能测试SG(SG10)满足并更新了一系列建议。这是列出当前功能测试宏的最新文档:有各种语言级功能的宏。期望在将新功能投入工作草案时更新文档P0096rx。
本文档不是标准文档:标准要求实现语言标准,标准化宏指示是否实现特定功能是没有意义的!实现要么完全符合要么不符合要求。但是,期望编译器供应商确实使用这些宏作为帮助用户的指导。
不幸的是,上次我检查MSVC没有计划实现功能测试宏。