Static initialization of pointers

Adrian Matoga via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 27 11:34:40 PDT 2017


The D language specification under "Global and static 
initializers" [1], says the following:

> The Initializer for a global or static variable must be
> evaluatable at compile time. Whether some pointers can be
> initialized with the addresses of other functions or data
> is implementation defined. Runtime initialization can be
> done with static constructors.

What is the rationale of making this implementation defined? 
What's the range of possible behaviors? Are there any 
circumstances in which a pointer can't be initialized with an 
address of a function or data? If so, couldn't a subset of cases 
have an explicitly defined, portable behavior?

As far as I've tested this, DMD, GDC and LDC can handle static 
initialization of pointers to functions or data (except that LDC 
fails if function pointer(s) are obtained via 
__traits(getUnitTests, module_name)), even across separately 
compiled modules, which is consistent with a similar feature of C 
and C++.

IIUC, the C standard always allows such initialization. In 6.6 
Constant expressions, N1570 [2] says:

> 7 More latitude is permitted for constant expressions
> in initializers. Such a constant expression shall be,
> or evaluate to, one of the following:
> — an arithmetic constant expression,
> — a null pointer constant,
> — an address constant, or
> — an address constant for a complete object type
>   plus or minus an integer constant expression.

and

> 9 An address constant is a null pointer, a pointer to an
> lvalue designating an object of static storage duration,
> or a pointer to a function designator; it shall be created
> explicitly using the unary & operator or an integer constant
> cast to pointer type, or implicitly by the use of an
> expression of array or function type. The array-subscript []
> and member-access . and -> operators, the address & and
> indirection * unary operators, and pointer casts may be used
> in the creation of an address constant, but the value of an
> object shall not be accessed by use of these operators.

[1] https://dlang.org/spec/declaration.html#global_static_init
[2] http://iso-9899.info/n1570.html


More information about the Digitalmars-d mailing list