在使用功能测试宏和Clang时,如何避免有关c++Future扩展的警告



我有一些针对C++14的代码,可以使用C++17的[[nodiscard]]属性。对我来说,使用功能测试宏来实现这一点似乎很自然:

#ifdef __has_cpp_attribute
#   if __has_cpp_attribute(nodiscard)
#       define NODISCARD [[nodiscard]]
#   else
#       define NODISCARD
#   endif
#else
#   define NODISCARD
#endif
struct NODISCARD SomeType {};

然而,Clang";有益的";警告我,我正在使用一个直到C++17:才存在的功能

<source>:12:8: warning: use of the 'nodiscard' attribute is a C++17 extension [-Wc++17-extensions]
struct NODISCARD SomeType {};
^
<source>:3:28: note: expanded from macro 'NODISCARD'
#       define NODISCARD [[nodiscard]]
^
1 warning generated.
Compiler returned: 0

这很烦人,因为我已经适当地验证了C++17功能的存在,即使我们是在C++14模式下编译。我不想关闭-Wc++17-extensions,但我需要抑制这种特殊的警告情况。

有没有一种好的方法可以使用Clang的功能测试宏来避免这些警告?或者有没有一个好的方法来抑制警告,只针对这些我已经验证过可以的情况?

您可以使用pragmaclang diagnostic:临时禁用诊断

#ifdef __has_cpp_attribute
#   if __has_cpp_attribute(nodiscard)
#       ifdef __clang__
#           define NODISCARD 
_Pragma("clang diagnostic push") 
_Pragma("clang diagnostic ignored "-Wc++17-extensions"") 
[[nodiscard]] 
_Pragma("clang diagnostic pop")
#       else
#           define NODISCARD [[nodiscard]]
#       endif
#   endif
#endif
#ifndef NODISCARD
#    define NODISCARD
#endif
struct NODISCARD SomeType {};

最新更新