more enum and pragma troubles

Jesse Phillips Jesse.K.Phillips+D at gmail.com
Sat Aug 17 12:36:07 PDT 2013


On Saturday, 17 August 2013 at 05:22:53 UTC, captaindet wrote:
> import std.stdio;
>
> enum Test{
> 	test2 = 2,
> 	test4 = 4
> }

Enumeration.

> enum foo = Test.test2;

Manifest Const

> Test bar = Test.test4;

Runtime variable.

Enum is being abused. In the first case you are declaring an 
enumeration[1], these values are known at compile time.

Second you defined a manifest constant, this is what you would 
see from #define in C. The symbol, foo, is replaced by the right 
hand side when referenced.

Third you've declared a variable, bar, which will store your 
enumerated value, 4. Variables are not compile time, even if the 
value stored came from a compile time known value.

     int foobar = 5; // 5 is known at compile time, foobar is not.

> pragma( msg, foo );		// why does it print: cast(Test)2

You are referring to a manifest constant, this is a simple 
textual replacement. Enumerations are typed, 2 is not a Test, so 
the compiler will write out a cast  so the type system is happy. 
Similarly Test.test2 is not the value of foo, foo is a signal to 
the compiler to insert "cast(Test)2."

Hope that makes sense.

1. http://en.wikipedia.org/wiki/Enumeration


More information about the Digitalmars-d-learn mailing list