gpt4 book ai didi

c++ - 如何在预处理器中检测 -stdlib=libc++?

转载 作者:IT老高 更新时间:2023-10-28 23:14:02 25 4
gpt4 key购买 nike

我认为这是 No type named 'unique_ptr' in namespace 'std' when compiling under LLVM/Clang 问题的一部分. According to Marshall Clow ,我可以通过 _LIBCPP_VERSION 检测到 -stdlib=libc++:

If you're writing cross-platform code, sometimes you need to know what standard library you are using. In theory, they should all offer equivalent functionality, but that's just theory. Sometimes you just need to know. The best way to check for libc++ is to look for the preprocessor symbol _LIBCPP_VERSION. If that's defined, then you're using libc++.

#ifdef  _LIBCPP_VERSION
// libc++ specific code here
#else
// generic code here
#endif

不幸的是,这与 Apple 的 Clang (3.4-SVN) 和我从 LLVM 项目下载后从源代码构建的 Clang (3.6) 不同。我猜这个测试只在 Xcode 下有效。

如何在预处理器中可靠地检测到 -stdlib=libc++


这是测试用例:

$ cat test-clapple.cxx

// Need to test {C++03,C++11} x {libc++, no libc++}

// c++ -c test-clapple.cxx
// - OK
// c++ -stdlib=libc++ -c test-clapple.cxx
// - OK
// c++ -std=c++11 -c test-clapple.cxx
// - FAILS, no type named 'unique_ptr' in namespace 'std'
// c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx
// - OK

#include <ciso646>

#if (__cplusplus >= 201103L) || (_MSC_VER >= 1600)
# pragma message "C++11"
#elif (__cplusplus >= 199711L)
# pragma message "C++03"
#endif

#if (_LIBCPP_VERSION)
# pragma message "libc++"
#else
# pragma message "no libc++"
#endif

#if defined(__apple_build_version__)
# pragma message "Apple build"
#else
# pragma message "non-Apple build"
#endif

#if (__cplusplus >= 201103L) || (_MSC_VER >= 1600) // C++11
# include <memory>
#else
# include <tr1/memory>
#endif

// Manage auto_ptr warnings and deprecation in C++11
#if (__cplusplus >= 201103L) || (_MSC_VER >= 1600)
template<typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif // C++11

int main(int argc, char* argv[])
{
return argc;
}

此项目不使用 Autotools、Cmake、Boost 或其他外部库或框架。

最佳答案

唯一效果-stdlib=libc++预处理器上的功能是更改用于查找标准库头文件的包含路径,因此您无法检测到 -stdlib=libc++ 的存在。在命令行本身上,您只能检测包含哪些标准库头文件。显然,如果不实际包含一个或多个标准库头文件,您将无法检测到这一点。

如果包含任何 libc++ 头文件,那么 _LIBCPP_VERSION会被定义,所以检测方式-stdlib=libc++是包含至少一个 C++ 库头文件并检查 _LIBCPP_VERSION .

在C++20及以后,推荐#include <version> ,这是专门为此目的而创建的。 C++20之前推荐#include <ciso646>它在 C++ 中没有任何用途并且什么也不声明,但是对于 libc++ 确实定义了 _LIBCPP_VERSION宏。但是,对于历史上的 libstdc++ <ciso646> 没有定义任何宏,例如 __GLIBCXX__可用于检测 libstdc++。 GCC 6.1 改变了,所以 <ciso646>现在可以使用,但对于旧版本,您需要包含不同的 header 来检测 libstdc++。

关于c++ - 如何在预处理器中检测 -stdlib=libc++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com