C++11 标记C+的便携式方法+;声明为C+接受的弃用声明+;11

C++11 标记C+的便携式方法+;声明为C+接受的弃用声明+;11,c++11,boost,g++,c++14,C++11,Boost,G++,C++14,C++14最后添加了[[deprecated]]属性。我想在头文件中使用它,它也需要在C++ 11模式下被消耗而不阻塞。 我不介意C++ 11模式中的忽略是否被忽略。 我还没有找到一个可移植地包装此语言功能的Boost宏,因此我在每个声明之前都添加了以下代码,我希望这些声明不支持以下代码: #if __cplusplus >= 201402L [[deprecated]] #endif 对于使用Boost或其他公共库使其更干净,有什么建议吗 注意:我主要针对的是G++4.8和5.x如果您

C++14最后添加了
[[deprecated]]
属性。我想在头文件中使用它,它也需要在C++ 11模式下被消耗而不阻塞。 我不介意C++ 11模式中的忽略是否被忽略。 我还没有找到一个可移植地包装此语言功能的Boost宏,因此我在每个声明之前都添加了以下代码,我希望这些声明不支持以下代码:

#if __cplusplus >= 201402L
[[deprecated]]
#endif
对于使用Boost或其他公共库使其更干净,有什么建议吗


注意:我主要针对的是G++4.8和5.x

如果您使用了CMake,您可以使用CMake模块生成的预处理器指令处理
[[弃用]]
属性:


我尝试了它,并从生成的文件中提取了与主要目标g++相关的代码:

# define foo_COMPILER_IS_GNU 0

#if defined(__GNUC__)
# undef foo_COMPILER_IS_GNU
# define foo_COMPILER_IS_GNU 1
#endif

#  if foo_COMPILER_IS_GNU
#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
#      define foo_COMPILER_CXX_ATTRIBUTE_DEPRECATED 1
#    else
#      define foo_COMPILER_CXX_ATTRIBUTE_DEPRECATED 0
#    endif
#  endif

#  ifndef foo_DEPRECATED
#    if foo_COMPILER_CXX_ATTRIBUTE_DEPRECATED
#      define foo_DEPRECATED [[deprecated]]
#      define foo_DEPRECATED_MSG(MSG) [[deprecated(MSG)]]
#    elif foo_COMPILER_IS_GNU
#      define foo_DEPRECATED __attribute__((__deprecated__))
#      define foo_DEPRECATED_MSG(MSG) __attribute__((__deprecated__(MSG)))
#    else
#      define foo_DEPRECATED
#      define foo_DEPRECATED_MSG(MSG)
#    endif
#  endif
我想这是你能为g++编写的最完整的代码了。如果需要支持其他编译器,请将它们添加到上面CMake代码中的
编译器
行,然后重新运行CMake以更新生成的文件


一旦包含,此代码将允许您替换原始代码:

#if __cplusplus >= 201402L
[[deprecated]]
#endif
与:

或者,使用带有消息的版本:

foo_DEPRECATED_MSG("this feature is deprecated, use the new one instead")
用法:

class DEPRECATED_MSG("Use class Y instead") X {};

你使用像CMake这样的工具吗?不,只是Eclipse内置的Bu建dMeNT我已经浏览过了,我正在寻找一个更基于InFraseCl的解决方案。一个基于基础结构的解决方案是针对支持C++ 14的编译器。我已经切换到C++ 14模式,无论它支持什么地方,不可预知的环境之一暂时不正式支持C++ 11以上。所以我想保持代码库整洁,直到我们可以切换到所有平台上的C++ 14。谢谢,这是有启发性的阅读!不过,我不希望在不久的将来切换构建系统…@YitzikC您不需要:只需使用我为g++提取的代码即可。如果您需要其他编译器,请将cmake与给定代码段一起使用,以生成更完整的代码,并将其用于您的项目和构建系统中
foo_DEPRECATED_MSG("this feature is deprecated, use the new one instead")
#if __cplusplus >= 201402L
# define DEPRECATED          [[deprecated]]
# define DEPRECATED_MSG(msg) [[deprecated(msg)]]
#else
# define DEPRECATED
# define DEPRECATED_MSG(msg)
#endif
class DEPRECATED_MSG("Use class Y instead") X {};