Static initialization order

Justin Johansson no at spam.com
Sun Feb 7 16:20:59 PST 2010


Ali Çehreli wrote:
> Justin Johansson wrote:
>  > Walter Bright wrote:
>  >> Justin Johansson wrote:
>  >>> May I ask, what are the best solutions for C++ (my current
>  >>> dilemma) and what steps will be taken in D2 to zap it.
>  >>
>  >> Within a module, static initialization is done in lexical order.
>  >>
>  >> Across modules, static initialization is performed so that imported
>  >> modules are initialized before the importer.
>  >>
>  >> This is true in D1 as well as D2.
>  >
>  > Thanks for the clarification for both D1 and D2.  Certainly D's approach
>  > beats the hit-and-miss approach in C++.
> 
> That's unfortunate and has been many causes of bugs for C++ programs.
> 
> C++ follows C's model of separate compilation. The C++ compiler never 
> sees more than one translation unit (a source file after all 
> preprocessor magic applied to it) at a time.
> 
> The best C++ could do was to define the order in that single translation 
> unit; and that is the same order as D's.
> 
> Ali

Thanks for your comment, Ali.

Yes, well, that unfortunately is what I'm doing in my C++ project ..
putting implementation of all the static class declarations in one
big file.  It's a bit of a pain because that makes for another file
to maintain rather having the static init source code in the respective
class .cpp file.  On the other hand, at least I can see all the static
inits in one place and that turns out to be a small benefit.

The only other idea, of dubious worth, is to create a "proxy"
initialization class which is parameterized with a init-order
priority attribute.  Concept is that all these proxies would collated
and sorted according to their priority.  Upon entering main() each
static init is fired off in the priority-ordered init order.

D1 isn't completely without its warts though.  When I was trying to
implement this particular project in D1, I had all sorts of circular
reference problems, either compiling or linking code (can't remember
which), to do with static objects and so I still had to resort to
collating some disparate code into a single file.  Like I say, I
cannot remember the full details of the workaround but there was
something on D.help which addressed the issue.

Cheers

Justin




More information about the Digitalmars-d mailing list