On Fri, 14 Mar 2014 10:11:25 -0400, Ethan <goober...@gmail.com> wrote:

On Friday, 14 March 2014 at 14:02:06 UTC, Steven Schveighoffer
wrote:

And for that point, your demonstration has failed :)

It's an extraordinarily simple use case, but it is still quite a
common pattern in C++ defines, ie:

#ifdef _DEBUG
#define FEATUREA
#define FEATUREB
#define FEATUREC
#else
#define FEATUREB
#define FEATUREC
#endif

#ifdef FEATUREB
...
#endif

No, not really, there was no else in the version. It's when you have two different versions that may trigger the same definition.

#if defined(MODEA) || defined(MODEB)
#define FEATUREA
#define FEATUREB
#endif

In D, this is:

version(MODEA) version = USEFEATUREAANDB;
version(MODEB) version = USEFEATUREAANDB;

...

version(USEFEATUREAANDB) // imagine reading this first, and wondering what causes it to compile.
{
   version = FEATUREA;
   version = FEATUREB;
}

It's the equivalent of this in C:

#ifdef MODEA
#define USEFEATUREAANDB
#endif
#ifdef MODEB
#define USEFEATUREAANDB
#endif

...

#ifdef USEFEATUREAANDB
#define FEATUREA
#define FEATUREB
#endif

Yes, there are real world examples where the lack of logical or makes things difficult to read. It's not all about versioning based on OS or boolean flags.

-Steve

Reply via email to