| |
 | Posted by Michael V. Franklin in reply to Tony | Permalink Reply |
|
Michael V. Franklin 
| 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
|