real simple manifest constant question probably regret asking...

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Mar 15 22:05:08 PDT 2017


On 03/15/2017 08:27 PM, WhatMeForget wrote:
 >
 > One of my D books says: "an enum declared without any braces is called a
 > manifest constant." The example shows,
 >
 > enum string author = "Mike Parker";
 >
 > Is this equivalent to
 > const string author = "Mike Parker";
 > or
 > immutable string author = "Mike Parker";
 >
 > I guess what I'm asking is does enum give you some advantages over say
 > non-enum constants?

The guideline should be, "prefer enum except when the type is an array 
except if it's a string." :)

You can think of enum as a text replacement similar to C macros. 
Whenever you see 'author' in code, it would be as if it was replaced 
with its value:

     writeln(author);
     writeln("Mike Parker");    // Same as above

The limitation is that just like you cannot take the address of e.g. 42, 
you can't take the address of an enum:

     // All lines below are compilation errors: "not an lvalue"
     writeln(&42);
     writeln(&"Mike Parker");
     writeln(&author);

const static and immutable have the advantage of being initialized at 
runtime. This one reads the name from a file:

import std.stdio;

immutable string author;

string makeAuthor() {
     import std.file;
     auto content = read("author_name_file");
     return cast(string)content;
}

shared static this() {
     author = makeAuthor();
}

void main() {
     writeln(author);
}

Ali



More information about the Digitalmars-d-learn mailing list