如何在Clang中检测libstdc ++版本?

And*_*zej 9 c++ clang c-preprocessor

我想在Clang中编写一个"可移植"的C++库."可移植"意味着我检测(在C预处理器中)编译环境中可用的C++功能并使用这些功能或提供我的解决方法.这类似于Boost库正在做的事情.

但是,某些功能的存在不取决于语言,而是取决于标准库实现.我特别感兴趣的是:

  • 类型特征(哪些是可用的和拼写的)
  • 如果initializer_listconstexpr.

我发现这有问题,因为默认情况下Clang不使用自己的标准库实现:它使用libstdc ++.虽然锵有预定义的预处理宏__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,它们分别硬编码值4,2,1,他们告诉我一些关于可用的libstdc ++的功能.

如何在Clang预处理器中检查它使用的libstdc ++版本?

rub*_*nvb 3

Clang 确实带有自己的标准库实现,称为libc++-stdlib=libc++您可以通过添加到编译命令来使用它。

话虽这么说,有多种方法可以检查 Clang/libstdc++ C++ 支持:

  1. Clang 具有__has_feature可用于检测语言功能和语言扩展的宏(和朋友)。
  2. Libstdc++ 有自己的版本宏,请参阅文档。不过,您需要包含 libstdc++ 标头才能定义这些内容。
  3. GCC 有您已经发现的版本宏,但需要手动将其与文档进行比较。

而且,这花了我 2 分钟的谷歌搜索。

  • 正如链接文档中所述,“__GLIBCXX__”不是版本号的单调函数,4.4.0 的数字比 4.3.6 小得多,这使得很难用来检查功能。 (2认同)