Eric Niebler actually asked this on StackOverflow a few years ago: https://stackoverflow.com/q/48045470/2069064
The accepted answer there is: #define PP_THIRD_ARG(a,b,c,...) c#define VA_OPT_SUPPORTED_I(...) PP_THIRD_ARG(__VA_OPT__(,),true,false,)#define VA_OPT_SUPPORTED VA_OPT_SUPPORTED_I(?) Barry On Wed, Jan 27, 2021 at 2:47 PM Richard Smith via SG10 < [email protected]> wrote: > Uh-oh. Using > > #ifdef __VA_OPT__ > > as a feature test system is problematic because we previously said that > __VA_OPT__ is ill-formed if it appears anywhere other than in a #define for > a variadic macro. Several existing C++20 implementations reject that #ifdef. > > Perhaps we don't need a feature-test macro, though: > > #define HAS_VA_OPT_IMPL___VA_OPT__(...) 0 > #define HAS_VA_OPT_IMPL_YES 1 > #define HAS_VA_OPT_IMPL(A, ...) HAS_VA_OPT_IMPL_ ## __VA_OPT__(YES) > #define HAS_VA_OPT HAS_VA_OPT_IMPL(HAS_VA_OPT_IMPL_, YES) > > #if HAS_VA_OPT > ... > #else > ... > #endif > > ... seems to work out OK. > > > On Tue, Jan 26, 2021 at 6:28 AM Ben Craig <[email protected]> wrote: > >> +1 >> >> >> >> *From:* Liaison <[email protected]> *On Behalf Of *Thomas >> Köppe via Liaison >> *Sent:* Monday, January 25, 2021 5:21 PM >> *To:* Richard Smith <[email protected]> >> *Cc:* Thomas Köppe <[email protected]>; [email protected]; >> [email protected] >> *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 <[email protected]> >> wrote: >> >> [+WG14 liaison list] >> >> >> >> >> >> On Mon, Jan 25, 2021 at 2:59 PM Richard Smith <[email protected]> >> wrote: >> >> Hi, >> >> >> >> 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: >> >> >> >> #if __cpp_va_opt >> >> #define FOO(a, ...) f(a __VA_OPT__(,) __VA_ARGS__) >> >> #elif __GNUC__ >> >> #define FOO(a, ...) f(a , ## __VA_ARGS__) >> >> #else >> >> // Hopefully we get the MSVC implicit comma deletion behavior. >> >> #define FOO(a, ...) f(a , __VA_ARGS__) >> >> #endif >> >> >> >> 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 >> >> >> >> #ifdef __VA_OPT__ >> >> ... >> >> >> >> 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. >> >> >> >> Thoughts? >> >> Richard >> >> -- > SG10 mailing list > [email protected] > https://lists.isocpp.org/mailman/listinfo.cgi/sg10 >
-- SG10 mailing list [email protected] https://lists.isocpp.org/mailman/listinfo.cgi/sg10
