我有一些针对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 {};