digitalmars.D.learn - Struct definition after static if
- Zarathustra (52/52) Dec 14 2009 I must to put a 'struct definition' inside a 'static if block' but other...
- Don (2/61) Dec 14 2009 Does that compile??? It shouldn't. !< is a floating-point operator.
- Zarathustra (20/21) Dec 14 2009 Of course that compile (thanks Got DMD behaviors logically). In this cas...
- bearophile (9/9) Dec 14 2009 Matthew:
- Simen kjaeraas (12/66) Dec 14 2009 Looks to me like a forward reference problem. Sadly, there
- Zarathustra (4/18) Dec 14 2009 Thanks Simen. I hoped D will be bugless and static if will be possible i...
- Simen kjaeraas (6/8) Dec 14 2009 Static if will probably never be usable inside enums. The best way to
I must to put a 'struct definition' inside a 'static if block' but other
'struct definition' doesn't see them.
static if(_WIN32IE !< 0x0400)
struct TVINSERTSTRUCT{
HTREEITEM hparent ;
HTREEITEM hinsertafter;
union tagDUMMYUNIONNAME{
TVITEMEX itemex;
TVITEM item;
}
tagDUMMYUNIONNAME DUMMYUNIONNAME;
alias DUMMYUNIONNAME.itemex itemex;
alias DUMMYUNIONNAME.item item ;
}
else
struct TVINSERTSTRUCT{
HTREEITEM hParent;
HTREEITEM hInsertAfter;
TVITEM item;
}
static if(_WIN32IE !< 0x0600)
struct TVITEMEX{
UINT mask ;
HTREEITEM item ;
UINT state ;
UINT statemask ;
TSTR text ;
UINT textmax ;
INT image ;
INT selectedimage;
INT children ;
LPARAM lparam ;
INT integral ;
UINT stateex ;
HWND hwnd ;
INT expandedimage;
}
else
struct TVITEMEX{
UINT mask ;
HTREEITEM item ;
UINT state ;
UINT statemask ;
TSTR text ;
UINT textmax ;
INT image ;
INT selectedimage;
INT children ;
LPARAM lparam ;
INT integral ;
}
It works only if I declare TVITEMEX before TVINSERTSTRUCT. And the second
question, Is it possible to use anonymous unions and structs?
Dec 14 2009
Zarathustra wrote:
I must to put a 'struct definition' inside a 'static if block' but other
'struct definition' doesn't see them.
static if(_WIN32IE !< 0x0400)
struct TVINSERTSTRUCT{
HTREEITEM hparent ;
HTREEITEM hinsertafter;
union tagDUMMYUNIONNAME{
TVITEMEX itemex;
TVITEM item;
}
tagDUMMYUNIONNAME DUMMYUNIONNAME;
alias DUMMYUNIONNAME.itemex itemex;
alias DUMMYUNIONNAME.item item ;
}
else
struct TVINSERTSTRUCT{
HTREEITEM hParent;
HTREEITEM hInsertAfter;
TVITEM item;
}
static if(_WIN32IE !< 0x0600)
struct TVITEMEX{
UINT mask ;
HTREEITEM item ;
UINT state ;
UINT statemask ;
TSTR text ;
UINT textmax ;
INT image ;
INT selectedimage;
INT children ;
LPARAM lparam ;
INT integral ;
UINT stateex ;
HWND hwnd ;
INT expandedimage;
}
else
struct TVITEMEX{
UINT mask ;
HTREEITEM item ;
UINT state ;
UINT statemask ;
TSTR text ;
UINT textmax ;
INT image ;
INT selectedimage;
INT children ;
LPARAM lparam ;
INT integral ;
}
It works only if I declare TVITEMEX before TVINSERTSTRUCT. And the second
question, Is it possible to use anonymous unions and structs?
Does that compile??? It shouldn't. !< is a floating-point operator.
Dec 14 2009
Don Wrote:Does that compile??? It shouldn't. !< is a floating-point operator.Of course that compile (thanks Got DMD behaviors logically). In this case !< mean nothing less >= NOT GREATER THAN is semantically same as GREATER OR EQUAL. Yes, you're right !< is a floationg-point operator but it doesn't matter. The problem is: struct B{ A a; } struct A{ } works ok, but struct B{ A a; } static if(TRUE) struct A{ } causes: Error: identifier 'A' is not defined Error: A is used as a type Error: variable B.a voids have no value
Dec 14 2009
Matthew:
A cleaned up case:
struct B { A a; }
static if(true)
struct A {}
void main() {}
I think this may be a forward reference bug.
Bye,
bearophile
Dec 14 2009
On Mon, 14 Dec 2009 15:43:49 +0100, Zarathustra <adam.chrapkowski gmail.com> wrote:I must to put a 'struct definition' inside a 'static if block' but other 'struct definition' doesn't see them. static if(_WIN32IE !< 0x0400) struct TVINSERTSTRUCT{ HTREEITEM hparent ; HTREEITEM hinsertafter; union tagDUMMYUNIONNAME{ TVITEMEX itemex; TVITEM item; } tagDUMMYUNIONNAME DUMMYUNIONNAME; alias DUMMYUNIONNAME.itemex itemex; alias DUMMYUNIONNAME.item item ; } else struct TVINSERTSTRUCT{ HTREEITEM hParent; HTREEITEM hInsertAfter; TVITEM item; } static if(_WIN32IE !< 0x0600) struct TVITEMEX{ UINT mask ; HTREEITEM item ; UINT state ; UINT statemask ; TSTR text ; UINT textmax ; INT image ; INT selectedimage; INT children ; LPARAM lparam ; INT integral ; UINT stateex ; HWND hwnd ; INT expandedimage; } else struct TVITEMEX{ UINT mask ; HTREEITEM item ; UINT state ; UINT statemask ; TSTR text ; UINT textmax ; INT image ; INT selectedimage; INT children ; LPARAM lparam ; INT integral ; } It works only if I declare TVITEMEX before TVINSERTSTRUCT.Looks to me like a forward reference problem. Sadly, there still are some of those in the language.And the second question, Is it possible to use anonymous unions and structs?Yes. http://www.digitalmars.com/d/2.0/faq.html#anonymous struct Foo { union { int a; int b; } // I HAZ NO NAYM struct { int c; int d; } // I HAZ NO NAYM } -- Simen
Dec 14 2009
Simen kjaeraas Wrote:Looks to me like a forward reference problem. Sadly, there still are some of those in the language. Yes. http://www.digitalmars.com/d/2.0/faq.html#anonymous struct Foo { union { int a; int b; } // I HAZ NO NAYM struct { int c; int d; } // I HAZ NO NAYM } -- SimenThanks Simen. I hoped D will be bugless and static if will be possible inside enums. Best regards
Dec 14 2009
Zarathustra <adam.chrapkowski gmail.com> wrote:Thanks Simen. I hoped D will be bugless and static if will be possible inside enums.Static if will probably never be usable inside enums. The best way to get something like it - at least currently - is to use string mixins and/or the defineEnum template in std.typecons. -- Simen
Dec 14 2009









bearophile <bearophileHUGS lycos.com> 