Top 5

Yigal Chripun yigal100 at gmail.com
Thu Oct 9 09:48:15 PDT 2008


Yigal Chripun wrote:
> Benji Smith wrote:
>> Steven Schveighoffer wrote:
>>> "Benji Smith" wrote
>>>> Gide Nwawudu wrote:
>>>>> 2) Finalise const/invariant stuff and change manifest const from
>>>>> 'enum' to 'define' (or whatever).
>>>>>
>>>>> define {
>>>>> double PI = 3.14;
>>>>> string author = "Walter";
>>>>> }
>>>>> define enum Direction { North, South, East, West };
>>>> I've never quite understood what people are talking about when they
>>>> refer to a "manifest" constant. What does that mean?
>>>>
>>>> And why do we need any special keyword? What does the "define"
>>>> keyword give you that an ordinary variable declaration doesn't? Why
>>>> not just write the code from above like this:
>>>>
>>>>   double PI = 3.14;
>>>>   string author = "Walter";
>>>>   enum Direction { North, South, East, West };
>>>>
>>>> What am I missing here?
>>> You cannot take the address of a manifest constant, and it doesn't
>>> live in a static data space or in memory anywhere.  Instead it is
>>> built directly into the code.
>>>
>>> So when you say
>>>
>>> define double PI = 3.14;
>>>
>>> And then use PI:
>>>
>>> auto x = PI;
>>>
>>> This generates code that declares a variable x, then assigns it to
>>> 3.14. the PI symbol isn't stored in the final code.
>>>
>>> This has a huge benefit when you are declaring lots of constants, but
>>> only few will be used.  You don't have to pay the penalty of storing
>>> all the constants in your code, only the ones you use, and only where
>>> you use them.
>>>
>>> -Steve 
>> Okay. That makes sense.
>>
>> I was just working with the tango.sys.win32.Types module yesterday, and
>> it uses "enum" to declare something like five or six thousand different
>> named constants, so I can see where that kind of thing would be helpful.
>>
>> --benji
> 
> instead of having a special syntax for manifest constants, they could be
> part of AST macros, or templates, or other compile time feature of D.
> also, can't we use: "invariant PI = 3.14;" and have the linker optimize
> this when necessary?

never mind my post, Don already raised the linker issue.



More information about the Digitalmars-d mailing list