【发布时间】:2014-03-04 13:24:29
【问题描述】:
我想用 Clang 编写一个“便携式”C++ 库。 “可移植”意味着我(在 C 预处理器中)检测编译环境中可用的 C++ 功能并使用这些功能或提供我的解决方法。这类似于 Boost 库正在做的事情。
但是,某些功能的存在并不取决于语言,而是取决于标准库的实现。我特别感兴趣:
- 类型特征(其中哪些可用以及使用何种拼写)
- 如果
initializer_list是constexpr。
我发现这是有问题的,因为默认情况下 Clang 不使用自己的标准库实现:它使用 libstdc++。虽然 Clang 已经预定义了预处理器宏 __GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__,但它们分别被硬编码为值 4、2、1,并且它们很少告诉我有关可用的 libstdc++ 功能的信息。
我如何在 Clang 预处理器中检查它正在使用哪个版本的 libstdc++?
【问题讨论】:
-
所以您得出的结论是,主要因素是标准库实现,但您想检测编译器版本?你的逻辑到底是什么?
libstdc++与 gcc 源分发,它仍然是一个不同的项目,没有什么让你认为你可以将 libstdc++ 的版本精确定位到特定的发布 gcc。 -
如果我知道标准库(即 libstdc++)中存在某些内容,我想有条件地编译一些代码(即通过预处理器指令禁用一些代码)。我想用预处理器宏来检测库中是否存在某些东西,或者通过其他有助于我检测到的方式。如果没有这样的方法,那也可以很好地回答我的问题。
-
@Andrzej 我不确定这将如何工作。如果您的标准库实现不支持某个功能或有错误代码,那么它将没有该功能或无法按您期望的方式工作。如果标准库中不存在备用实现,您可以在此处查找其他问题,向您展示如何使用它。
-
我可能没有清楚地表达我的意图。我正在用@remyabel 编写一个类:3 个成员函数:f1、f2、f3。如果我知道某些标准库功能已损坏或不存在,我希望我的类只有两个函数 f1 和 f2。我不想要 f3,因为它必须使用损坏的功能。
-
@user2485710:现在我明白你在说什么了。你说得对。 GCC 版本是个坏主意,我应该要求的是 libstdc++ 版本。
标签: c++ clang c-preprocessor