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