#ifdef HAVE_CPP11_liB_SUPPORT #include <memory>#else #include <tr1/memory>#endif#ifdef HAVE_CPP11_liB_SUPPORT vector.emplace_back(newValue);#else vector.push_back(newValue);#endif
虽然找到为此选项设置的预处理器宏(如果确实有任何),但我遇到了麻烦.我试过转储clang的输出:
clang -x c++ -std=c++11 -stdlib=libc++ -dM -E - < /dev/null
比较:
clang -x c++ -std=c++11 -stdlib=libstdc++ -dM -E - < /dev/null
但这给出了相同的结果.请注意,我不想打开是否使用c 11语言设置,而是我们是否使用c 11库.有没有可靠的方法在代码中检测到这一点?
解决方法 我不知道任何确定的方式可以保证便携,但这是我现在使用的:// libc++ detected: _liBCPP_VERSION// libstdc++ detected: __GliBCXX__#if defined(__clang__)# if __has_include(<__config>) // defines _liBCPP_VERSION# include <__config># elif __has_include(<bits/c++config.h>) // defines __GliBCXX__# include <bits/c++config.h># else# include <ios># endif#elif defined(__GNUC__) // gcc does not have __has_include# include <ios> // ios should include the c++config.h which defines __GliBCXX__#endif
这不是很好,但现在对我有用.
libc定义了_liBCPP_VERSION,stdc定义了__GliBCXX__这很好,但不幸的是这些宏没有被编译器定义.相反,它们是在非标准头文件中定义的,除非包含该标头,否则无法测试它们的定义.
注意:显然stdc在旧版本中定义了__GliBCPP__.既然你需要c 11,这不会有问题.
Clang有一个很好的功能__has_include,它可以用来测试这些,但是如果没有找到标题,宏就会回退到只包含一个标准的标题,希望使用内部标题.我有< ios>在这里,但要包含的标准标题的选择取决于您.您可以查找包含内部标题的标题(类似于linux上的gcc):
grep -Rl '#include <bits/c++config.h>' /usr/include/c++
选择您可能在项目中使用的任何标题.
由于这不能保证适用于任何给定的过去或将来的编译器/标准库版本,我不会依赖这些定义,除了可选功能,如:
#ifdef __GliBCXX__ std::set_terminate(__gnu_cxx::__verbose_terminate_handler);#endif总结
以上是内存溢出为你收集整理的xcode – 使用c 11或旧版libstdc标准库检测clang是否正在编译全部内容,希望文章能够帮你解决xcode – 使用c 11或旧版libstdc标准库检测clang是否正在编译所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)