Thread overview
Conditional compilation of array of structs initializer
Nov 10, 2017
Tony
Nov 10, 2017
Tony
November 10, 2017
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;
}
November 10, 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
November 10, 2017
Thanks Mike!