如何为 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 制作标头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言找错误,200分答谢(为维特比译码程序)

hgame week2 week3

C#/Powershell 发送组合键

C中的十六进制到字符数组

20180514 存储地址

Re-DD-Hello