Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Dynamic initialization in C++ when you don't control main

I have a rather idiosyncratic C++14 initialization issue. I’m linking against a C library which provides main(). That library makes use of a global array that I’m meant to define, something like this:

extern int array[];

int main(void)
{
    for (int i = 0; array[i] != -1; i++) {
        printf("%d\n", i);
    }
}

The expected use is to initialize the array, e.g. int array[] = {1, 2, 3, -1}. But I want to be able to dynamically initialize it. I’m using C++14, so my thought was to create a global object with a constructor that writes to the array, like this:

int array[2];

struct Init {
    Init() {
        array[0] = 1;
        array[1] = -1;
    }
}

Init init;

But the C++14 standard says this:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

Am I reading this correctly that it’s possible that when main() runs, my object won’t yet have been constructed, meaning that my array won’t be initialized (or rather, will be default initialized, not by my class)?

If so, is there any way around this? I have no control over the library which provides main(). Am I out of luck in wanting to set the array’s value at startup time, before main() runs?

>Solution :

it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit

Emphasis "any function or variable". The "variable" part includes, of course, the global variable in question.

In other words, the initialization is guaranteed to occur before odr-use of the variable. Problem solved.

So, as soon as anything in your C++ program sneezes in the direction of "any function or variable" in the translation unit where the global array is defined, they will materialize into existence.

You are guaranteed before the array is odr-used, the initialized of init takes place, since it’s in the same translation unit, and that will take care of whipping array into shape, before it gets odr-used.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading