Subject: Re: [wg14/wg21 liaison] Feature test macro for P0306 (__VA_OPT__)
From: Ben Craig (ben.craig_at_[hidden])
Date: 2021-01-26 08:27:55
From: Liaison <liaison-bounces_at_[hidden]> On Behalf Of Thomas KÃ¶ppe via Liaison
Sent: Monday, January 25, 2021 5:21 PM
To: Richard Smith <richardsmith_at_[hidden]>
Cc: Thomas KÃ¶ppe <tkoeppe_at_[hidden]>; liaison_at_[hidden]; sg10_at_[hidden]
Subject: [EXTERNAL] Re: [wg14/wg21 liaison] Feature test macro for P0306 (__VA_OPT__)
The proposed solution seems elegant to me. If you say that's implementable, I'd be in favour of that.
I have very regrettably not sent an updated paper to WG14 for this feature, it's one of the things on my list. I shall prioritize getting it done!
On Mon, 25 Jan 2021 at 23:02, Richard Smith <richardsmith_at_[hidden]<mailto:richardsmith_at_[hidden]>> wrote:
[+WG14 liaison list]
On Mon, Jan 25, 2021 at 2:59 PM Richard Smith <richardsmith_at_[hidden]<mailto:richardsmith_at_[hidden]>> wrote:
SD-FeatureTest doesn't mention P0306. I think a feature test macro would be useful here, to allow projects to incrementally adopt the new functionality. Example:
#define FOO(a, ...) f(a __VA_OPT__(,) __VA_ARGS__)
#define FOO(a, ...) f(a , ## __VA_ARGS__)
// Hopefully we get the MSVC implicit comma deletion behavior.
#define FOO(a, ...) f(a , __VA_ARGS__)
Note that the __GNUC__ extension is enabled by default, even in conforming modes, in GCC, Clang, and ICC. However, after the adoption of P0306, it's no longer a conforming extension, so presumably it will be phased out at some point, and uses of the feature-test macro, such as in the above example, are going to become necessary.
Regarding the name of the macro: this functionality is shared with C, and as such, a __cpp_* name is probably not ideal. However, there's another interesting option: we could use
as the feature test mechanism. This doesn't appear to conflict with anything else, and is in line with our feature test mechanism for __has_cpp_attribute and __has_include.
So that's my suggestion: #ifdef/#ifndef/defined should treat `__VA_OPT__` as if it were the name of a defined macro.
SG10 list run by firstname.lastname@example.org