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