On Friday, 20 March 2020 at 21:03:55 UTC, Jonathan M Davis wrote:
On Wednesday, March 18, 2020 10:23:26 AM MDT IGotD- via
Digitalmars-d-learn wrote:
I have not seen any example where version has several OR
matches.
Example idiom:
version(X86_64 || X86)
{
}
else version(ARM || Thumb)
{
}...
you get the idea. So is this possible at all or do you have to
duplicate the code for each version identifier despite they
are equal for many version identifiers?
To add to what the others have said, the reasons that Walter is
against having boolean conditions in version statements have to
do with how using boolean conditions in #ifdefs in C/C++ has
historically been a big source of bugs. So, disallowing it
helps prevent certain classes of bugs. It's why druntime
duplicates most C declarations across platforms.
What kind of bugs are those?
In general, I think that Walter's approach here is probably the
right one, but it can certainly be annoying in cases where you
have to duplicate code that actually is the same rather than
being subtly different, and a lot of people dislike it enough
that they use workarounds like those discussed in this thread.
Sadly it still shares probably the worst bug with the C preposser
in that anything that isnt defined simply evaluates to false. If
you have a typo then the code will still "work". His approach
only works if you can put an assert in the else branch. Which is
the case for C/C++ as well. That isnt always possible, as a
result you still have the same problem with typos.
And of course, some of the same bugs that come up with #ifdefs
come up with static ifs in generic code (particularly with
range-based code that changes what it's doing based on arange's
type), but at least those can be found with thorough tests on a
single platform, whereas version-related bugs tend to require
that you run thorough tests on each platform.
- Jonathan M Davis
You still need to test your code on those platforms, so if you
are supporting them you still have related problems.