如何为 C++0x/11 和非 C++0x/11 制作标头? [复制]
Posted
技术标签:
【中文标题】如何为 C++0x/11 和非 C++0x/11 制作标头? [复制]【英文标题】:How to make a header for C++0x/11 and non C++0x/11? [duplicate] 【发布时间】:2014-02-21 00:37:52 【问题描述】:我想为 C++0x/11 和非 C++0x/11 创建一个标头,以便向后兼容:
class Foo
public:
Foo()
Foo(Foo&)
#ifdef CXX0X //How to make it work here?
Foo(Foo&&)
#endif
;
【问题讨论】:
@chris 这如何区分两个 C++ 版本? @JohnKugelman__cplusplus
具有您可以测试的值。请参阅我评论中链接的问题。
@JohnKugelman,这是一个公平的开始。只需一次 Google 搜索即可获得答案。
@chris 那么你应该发布那个答案。并将其作为实际答案进行,以便人们对其进行投票。请不要在 cmets 部分回答问题。使用 cmets 询问更多信息或提出改进建议。
今后您还想了解 C++14 的一致性吗?
【参考方案1】:
我建议不要检查 __cplusplus
,因为 MSVC 或 GCC 都没有将它提升到 201103L
,而且它们都支持右值引用已有几年了。
您可以依靠特定于编译器的宏来做您想做的事情:
MSVC:_MSC_VER >= 1600
GCC:__GXX_EXPERIMENTAL_CXX0X__
叮当声:__has_feature(cxx_rvalue_references)
不过,这样做有几个缺点。由于宏是特定于编译器的,并且目标是支持多个编译器,因此需要将它们包装在另一个宏中。此外,还有人说__GXX_EXPERIMENTAL_CXX0X__
最终会被删除。
所以,最好使用像Boost.Config 这样的预构建工具。它已经通过宏 BOOST_NO_RVALUE_REFERENCES
提供了此功能。
你的例子应该是这样的:
#include <boost/config.hpp>
class Foo
public:
Foo();
Foo(Foo&);
#ifndef BOOST_NO_RVALUE_REFERENCES
Foo(Foo&&);
#endif
;
请记住,函数的定义必须以类似方式包装。
【讨论】:
还有feature test recommendation。 Clang 现在实现了它,希望其他编译器也能采用它。然后你可以使用#ifdef __cpp_rvalue_references
或者你可以查看具体的版本号。
@bames53,提供的实现支持它,我期待一种更标准的功能测试方法。然而,我并不期待它会鼓励人们写作的宏汤。【参考方案2】:
我会看一下 boost 配置库。它适用于库编写者,并且有很多宏来处理 C++ 编译器版本和实现细节。即使你知道它是一个 C++11 编译器,你可能仍然需要了解一些一致性细节——boost config 会告诉你。这是文档的链接:
http://www.boost.org/doc/libs/1_55_0/libs/config/doc/html/index.html
【讨论】:
以上是关于如何为 C++0x/11 和非 C++0x/11 制作标头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章