Date: Mon, 25 Jan 2021 14:59:49 -0800
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
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
Received on 2021-01-25 17:00:06