将C++声明标记为已弃用且C++ 11可接受的可移植方式

7xzttuei  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(203)

C14终于添加了[[deprecated]]属性。我想在头文件中使用它,这也需要在C11模式下使用而不会阻塞。
我不介意在C++11模式下忽略这个弃用。
我还没有找到一个Boost宏来 Package 这个语言特性,所以我在每个声明之前添加了下面的代码,我想弃用这些代码:

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

对于使用Boost或其他公共库来使这个更干净有什么建议吗?

**注意:**我的目标主要是G++ 4.8和5.x

hof1towb

hof1towb1#

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

include(WriteCompilerDetectionHeader)

write_compiler_detection_header(
    FILE foo_compiler_detection.h
    PREFIX foo
    COMPILERS GNU
    FEATURES cxx_attribute_deprecated
)

我试了一下,并从生成的文件中提取了与主要目标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代码中的COMPILERS行,然后重新运行CMake来更新生成的文件。
一旦包含,此代码将允许您替换原始代码:

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

其中:

foo_DEPRECATED

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

foo_DEPRECATED_MSG("this feature is deprecated, use the new one instead")
t98cgbkg

t98cgbkg2#

#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 {};

相关问题