C++ Logo

sg10

Advanced search

Re: [SG10] __has_cpp_attribute example

From: Richard Smith <richard_at_[hidden]>
Date: Wed, 12 Oct 2016 12:36:08 -0700
On Wed, Oct 12, 2016 at 3:55 AM, Jonathan Wakely <cxx_at_[hidden]> wrote:

> The SD-6 draft has
>
> [3.3.6] Example
>
> This demonstrates a way to use the attribute [[deprecated]] only if it
> is available.
>
> #ifdef __has_cpp_attribute
> # if __has_cpp_attribute(deprecated)
> # define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
> # else
> # define ATTR_DEPRECATED(msg)
> # endif
> #endif
>
>
>
> This leaves ATTR_DEPRECATED undefined if the compiler doesn't support
> the __has_cpp_attribute macro, is that intended? Unless the idea is
> that some other method would be used to decide if it's available, it
> should be something like:
>
> #ifdef __has_cpp_attribute
> # if __has_cpp_attribute(deprecated)
> # define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
> # endif
> #endif
> #ifndef ATTR_DEPRECATED(msg)
> # define ATTR_DEPRECATED(msg)
> #endif
>

The usage model we've always documented for these __has_* macros in Clang
is:

#ifndef __has_cpp_attribute
# define __has_cpp_attribute(x) 0
#endif

#if __has_cpp_attribute(deprecated)
# define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
#else
# define ATTR_DEPRECATED(msg)
#endif

Would it also be useful to mention that the grammar term
> "attribute-token" allows scoped attributes, such as foo::bar, so that
> non-standard attributes can be tested the same way?
> _______________________________________________
> Features mailing list
> Features_at_[hidden]
> http://www.open-std.org/mailman/listinfo/features
>

Received on 2016-10-12 21:36:10