Conditional compilation of array of structs initializer

Michael V. Franklin slavo5150 at yahoo.com
Fri Nov 10 07:25:40 UTC 2017


On Friday, 10 November 2017 at 06:22:51 UTC, Tony wrote:
> Doing a port of some C code that has an #ifdef in the middle of 
> an initialization for an array of structs. I am getting a 
> compile error trying to get equivalent behavior with "static 
> if" or "version". Is there a way to achieve this other than 
> making two separate array initialization sections?
>
> struct a {
>    int y;
>    int z;
> }
>
> immutable string situation = "abc";
>
> int main()
> {
>    a[] theArray = [
>       { 10, 20 },
> // version(abc)
> static if (situation == "abc")
> {
>       { 30, 40 },
> }
>       { 50, 60 }
>       ];
>    return 0;
> }

Here's my attempt. There's probably a more elegant way, but it's 
the best I could do.

import std.stdio;

struct a {
     int y;
     int z;
}

enum situation = "abc";

int main()
{
     enum head = "a[] theArray = [ {10, 20},";
     static if (situation == "abc")
     {
         enum middle = "{ 30, 40},";	
     }
     else
     {
         enum middle = "";	
     }
     enum tail = "{ 50, 60 }];";
     mixin(head ~ middle ~ tail);
	
     writeln(head ~ middle ~ tail);
	
     return 0;
}

The use of enums for this is called manifest constants 
(https://dlang.org/spec/enum.html#manifest_constants).  It's more 
analogous to #define in C.

Mixins are documented here 
(https://dlang.org/spec/statement.html#mixin-statement)

Mike


More information about the Digitalmars-d-learn mailing list