www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - version in enum

reply =?UTF-8?B?w5hpdmluZA==?= <oivind.loe gmail.com> writes:
Hi,

Why doesn't this work? Seems like it should:

enum {
	A = 1,
	version(xx) {
		B = 2
	}
}

void main() {
	
}


Compilation output:
/d732/f174.d(5): Error: basic type expected, not version
/d732/f174.d(5): Error: no identifier for declarator int
/d732/f174.d(5): Error: if type, there must be an initializer
/d732/f174.d(5): Error: found 'version' when expecting ','
/d732/f174.d(5): Error: basic type expected, not (
/d732/f174.d(5): Error: function declaration without return type. 
(Note that constructors are always named 'this')
/d732/f174.d(5): Error: no identifier for declarator int(xx)
/d732/f174.d(5): Error: if type, there must be an initializer
/d732/f174.d(5): Error: found '{' when expecting ','
/d732/f174.d(8): Error: unrecognized declaration
Jan 09
next sibling parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 9 January 2016 at 12:43:32 UTC, Øivind wrote:
 Why doesn't this work? Seems like it should:
D defines version to only work on *complete* blocks. You're trying to use it on a partial block there. You'll have to try something else. Perhaps copying the whole enum in the different version blocks....
Jan 09
parent Jonathan M Davis via Digitalmars-d-learn writes:
On Saturday, January 09, 2016 13:32:49 Adam D. Ruppe via Digitalmars-d-learn
wrote:
 On Saturday, 9 January 2016 at 12:43:32 UTC, Øivind wrote:
 Why doesn't this work? Seems like it should:
D defines version to only work on *complete* blocks. You're trying to use it on a partial block there. You'll have to try something else. Perhaps copying the whole enum in the different version blocks....
Yeah. That's what we do in core.time.ClockType. You have to duplicate the entire enum for each version with each enum declaration listing exactly which members exist in that version, which is an annoying amount of code duplication, but unless you did something with string mixins to generate your enum, and it generated the actual declaration for you with all of the separate version blocks, you're stuck with that duplication. And I rather doubt that going to the effort of generating a string mixin just so that you can list each member exactly once is worth it. A related thing to consider (depending on what the enum is used for) is that with a differing list of enum members in each version, unless you specify the value of each enum member explictly, they'll differ in each version. In many cases, that probably doesn't matter, but it some, it would. So, it's something to think about when versioning an enum. - Jonathan M Davis
Jan 09
prev sibling parent Basile B. <b2.temp gmx.com> writes:
On Saturday, 9 January 2016 at 12:43:32 UTC, Øivind wrote:
 Hi,

 Why doesn't this work? Seems like it should:

 enum {
 	A = 1,
 	version(xx) {
 		B = 2
 	}
 }
It's not allowed in the grammar but I agree with you, it could be useful. Recent example where it could: --- enum VirtualKey { version(linux) VK_UP = 0; version(Win32) VK_UP = 1, .... } --- a solution is to define a manifest constant depending on your version() and to use a ternary expression in the enum definition. For me then this works: --- version(linux) enum ver = true; else enum ver = false; enum VirtualKey { VK_UP = (ver) ? 0 : 1, } --- Not ideal but it works.
Jan 09