version: multiple conditions
Joakim via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jun 30 10:56:44 PDT 2015
On Tuesday, 30 June 2015 at 16:19:56 UTC, Jonathan M Davis wrote:
> On Tuesday, 30 June 2015 at 15:55:49 UTC, bitwise wrote:
>> On Tuesday, 30 June 2015 at 02:30:44 UTC, Walter Bright wrote:
>>>
>>> I don't believe a macro processor is necessary to write
>>> systems code, nor do I believe version expressions are,
>>> either.
>>
>> Waiiit a minute...reading this again, it seems you are talking
>> about writing code for a single system.
>>
>> In that case, yea, I suppose you can get by without versions.
>> The market in multi-platform mobile apps is not something that
>> should be ignored though.
>
> You need version blocks to distinguish between platforms (be it
> OSes or architectures or whatever), but code like that should
> be wrapped at a fairly low level, and most code shouldn't have
> anything like that in it. e.g. druntime has tons of version
> blocks, whereas Phobos has relatively few. Certainly, in
> general, if you're using complex expressions for versions, you
> should probably be rethinking how you're doing your code. I've
> dealt with code before that shared code across multiple
> products and altered its behavior via ifdefs, and it was a
> _disaster_. It would have been _far_ cleaner to just separate
> it out via libraries and section off the system-specific code
> such that it was contained and generally small. Once in a
> while, being able to && or || version identifiers like linux
> and FreeBSD would be nice, but on the whole, I have to agree
> that if you're doing much of that, it's just a recipe for
> disaster. I suppose that the problem is that it's just useful
> enough in some cases that it's annoying not to have it, but if
> we _did_ have it, it would be abused like there's no tomorrow.
For a concrete example from my experience, take a massively
multi-platform codebase like Chromium, which is littered with
#ifdef logic like this, ie #if defined(OS_CHROMEOS) ||
defined(OS_WIN) || defined(OS_LINUX):
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/about_flags.cc?r1=279969&r2=279970&
It would be better if that logic weren't spread out everywhere
and was abstracted out into a single place, replaced by a more
specific named feature, as they've attempted to do a little here:
http://src.chromium.org/viewvc/chrome/trunk/src/build/build_config.h
Specifically, they can simply use USE_TCMALLOC instead of #if
(defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)) &&
!defined(NO_TCMALLOC) everywhere in the source.
Yes, that means you sometimes need to check build_config.h to see
how USE_TCMALLOC is defined when reading those other files,
rather than always having the logic on hand. That's the
trade-off, I think it's worth it.
I believe Walter is simply trying to enforce such centralization
of version logic, and I agree with him.
More information about the Digitalmars-d
mailing list