C14终于添加了[[deprecated]]属性。我想在头文件中使用它,这也需要在C11模式下使用而不会阻塞。我不介意在C++11模式下忽略这个弃用。我还没有找到一个Boost宏来 Package 这个语言特性,所以我在每个声明之前添加了下面的代码,我想弃用这些代码:
[[deprecated]]
#if __cplusplus >= 201402L [[deprecated]] #endif
对于使用Boost或其他公共库来使这个更干净有什么建议吗?
**注意:**我的目标主要是G++ 4.8和5.x
hof1towb1#
如果您使用了CMake,您可以使用CMake模块WriteCompilerDetectionHeader生成的预处理器指令来处理[[deprecated]]属性:
WriteCompilerDetectionHeader
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来更新生成的文件。一旦包含,此代码将允许您替换原始代码:
COMPILERS
其中:
foo_DEPRECATED
或者,使用带有消息的版本:
foo_DEPRECATED_MSG("this feature is deprecated, use the new one instead")
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 {};
2条答案
按热度按时间hof1towb1#
如果您使用了CMake,您可以使用CMake模块
WriteCompilerDetectionHeader
生成的预处理器指令来处理[[deprecated]]
属性:我试了一下,并从生成的文件中提取了与主要目标g++绑定的代码:
我想这是你能为g++生成的最完整的代码了。如果你需要支持其他编译器,把它们添加到上面CMake代码中的
COMPILERS
行,然后重新运行CMake来更新生成的文件。一旦包含,此代码将允许您替换原始代码:
其中:
或者,使用带有消息的版本:
t98cgbkg2#
用法: