www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Using two flags in conditonal compilation (version)

reply "Danyal Zia" <catofdanyal yahoo.com> writes:
Hi, In the development of my library, I'm in a position where I 
need to add support for multiple compilers. For instance, 
supporting both the assembly of LDC/DMD and GDC. I want to do 
something like:

version(DigitalMars && LDC)
{
}

However, it doesn't compile which forces me to rewrote the same 
code for both DigitalMars and LDC

version(DigitalMars)
{
}

version(LDC)
{
}

Is there a way to check both versions at the same time? (I can't 
seem to find the solution through google, sorry)

Thanks,
Danyal Zia
Jun 25 2014
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
Danyal Zia:

 Is there a way to check both versions at the same time? (I 
 can't seem to find the solution through google, sorry)
This is close to being the best solution in D (untested): version(DigitalMars) enum myMars = true; else enum myMars = false; version(LDC) enum myLdc = true; else enum myLdc = false; enum myMarsOrLdc = myMars || myLdc; static if (myMarsOrLdc) { ... } else { ... } Bye, bearophile
Jun 25 2014
prev sibling next sibling parent reply Justin Whear <justin economicmodeling.com> writes:
On Wed, 25 Jun 2014 20:24:30 +0000, Danyal Zia wrote:

 Hi, In the development of my library, I'm in a position where I need to
 add support for multiple compilers. For instance, supporting both the
 assembly of LDC/DMD and GDC. I want to do something like:
 
 version(DigitalMars && LDC)
 {
 }
 
 However, it doesn't compile which forces me to rewrote the same code for
 both DigitalMars and LDC
 
 version(DigitalMars)
 {
 }
 
 version(LDC)
 {
 }
 
 Is there a way to check both versions at the same time? (I can't seem to
 find the solution through google, sorry)
 
 Thanks,
 Danyal Zia
I think you mean ||, not &&. The best way I know around this is to define enums: version (DigitalMars) enum compiler_DigitalMars = true; else enum compiler_DigitalMars = false; //... similar for LDC static if (compiler_DigitalMars || compiler_LDC) { ... } else { ... }
Jun 25 2014
parent "Danyal Zia" <catofdanyal yahoo.com> writes:
On Wednesday, 25 June 2014 at 20:30:28 UTC, Justin Whear wrote:
 I think you mean ||, not &&.  The best way I know around this 
 is to
 define enums:

 version (DigitalMars)
    enum compiler_DigitalMars = true;
 else
    enum compiler_DigitalMars = false;

 //... similar for LDC

 static if (compiler_DigitalMars || compiler_LDC)
 {
    ...
 } else {
    ...
 }
Yeah, I mean ||. Your solution works, thanks a lot!
Jun 25 2014
prev sibling parent "Chris Nicholson-Sauls" <ibisbasenji gmail.com> writes:
version(DigitalMars) version = DMDAsm;
version(LDC) version = DMDAsm;

version(DMDAsm) asm {
   //dmd/ldc asm here
}
version(GDC) asm {
   //gdc asm here
}


http://dlang.org/version.html#VersionSpecification
Jun 25 2014