Viz
asked on
static members initilisation order
Just 75 points because I have no more.
I wish to know if it's possible to force the order of the statix members initialisation at runtime.
For example I have 10 classes (each one in separate files ".h" ".cpp") like :
class CTes01
{
...
static LONG m_lNumber;
}
LONG CTes01::m_lNumber=1;
class CTes02
{
...
static BOOL m_bFlag;
}
BOOL CTes02::bFlag=TRUE;
....
and I want to force the initialisation of CTes02::bFlag first. For the moment, the executer seems to choose the order he wants. How is possible to change this order.
I wish to know if it's possible to force the order of the statix members initialisation at runtime.
For example I have 10 classes (each one in separate files ".h" ".cpp") like :
class CTes01
{
...
static LONG m_lNumber;
}
LONG CTes01::m_lNumber=1;
class CTes02
{
...
static BOOL m_bFlag;
}
BOOL CTes02::bFlag=TRUE;
....
and I want to force the initialisation of CTes02::bFlag first. For the moment, the executer seems to choose the order he wants. How is possible to change this order.
I am not sure that I understand.
If you want to initialize m_bFlag first
declare:
class CTes02 {
public:
CTest02();
private:
BOOL m_bFlag02;
}
CTest02::CTes02():m_bFlag0 2(TRUE)
{
}
and declare
CTes02 a;
before you declare any instances of the other classes.
If you want to initialize m_bFlag first
declare:
class CTes02 {
public:
CTest02();
private:
BOOL m_bFlag02;
}
CTest02::CTes02():m_bFlag0
{
}
and declare
CTes02 a;
before you declare any instances of the other classes.
Are these classes related? Maybe a derived class would be a better model.
You cannot control the order of the initialization of the statics.
You can control the order of initialization of globals that are in a single translation unit, they initialize in the order they are declared. statics are a little trickier. The compiler can delay their initialization until the first time they are needed. In fact they might never be initialized.
You can control the order of initialization of globals that are in a single translation unit, they initialize in the order they are declared. statics are a little trickier. The compiler can delay their initialization until the first time they are needed. In fact they might never be initialized.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
From the C++ standard
9.4.2.7
Static data members are initialized and destroyed exactly like non-
local objects (_basic.start.init_, _basic.start.term_).
3.6.2.1
. . . Objects of namespace scope with static
storage duration defined in the same translation unit and dynamically
initialized shall be initialized in the order in which their defini-
tion appears in the translation unit.
Note, technically in my example, they statics might not be initalized in that order because they are POD types and beign initialized without a "real" constructor, but if they had cosntructors, the constructors would be called in that order.
9.4.2.7
Static data members are initialized and destroyed exactly like non-
local objects (_basic.start.init_, _basic.start.term_).
3.6.2.1
. . . Objects of namespace scope with static
storage duration defined in the same translation unit and dynamically
initialized shall be initialized in the order in which their defini-
tion appears in the translation unit.
Note, technically in my example, they statics might not be initalized in that order because they are POD types and beign initialized without a "real" constructor, but if they had cosntructors, the constructors would be called in that order.
ASKER
Nietod, you say
"you can control the order of initialization of statics within a single translation unit. The order is the order in which they are defined"
int A::Aint = 5; // This is first.
int B::Bint = 5; // This is second.
If I was working with a stand alone executable application I would have answered "Excellent" and you would have the 75 points, ro I would have try it before asking the question, but, I am working with multiple AfxDLLs in Visual C++, and I can't put all the initialisations in the same file.
You said something concerning Global variables. Are Global variables initialised before static members ?
"you can control the order of initialization of statics within a single translation unit. The order is the order in which they are defined"
int A::Aint = 5; // This is first.
int B::Bint = 5; // This is second.
If I was working with a stand alone executable application I would have answered "Excellent" and you would have the 75 points, ro I would have try it before asking the question, but, I am working with multiple AfxDLLs in Visual C++, and I can't put all the initialisations in the same file.
You said something concerning Global variables. Are Global variables initialised before static members ?
>> If I was working with a stand alone executable
>> application I would have answered "Excellent"
I don't have any control over the environment you are working in Nor do I have any knowledge about it, since you didn't state any of this before.
>> I am working with
>> multiple AfxDLLs in Visual C++
They will be initialized in the order that the DLLs are loaded. If DLL A uses DLL B, then DLL B will be loaded first and its statics and globals will be initialized before A's.
They are initialized in the same sequence, starting at the top of the translation unit. (trivial initializations, like those for numerics, may be done before, at compile time.)
>> application I would have answered "Excellent"
I don't have any control over the environment you are working in Nor do I have any knowledge about it, since you didn't state any of this before.
>> I am working with
>> multiple AfxDLLs in Visual C++
They will be initialized in the order that the DLLs are loaded. If DLL A uses DLL B, then DLL B will be loaded first and its statics and globals will be initialized before A's.
They are initialized in the same sequence, starting at the top of the translation unit. (trivial initializations, like those for numerics, may be done before, at compile time.)
ASKER
Thanks nietod for the answer.
Just a last point, you didn't answer concerning global paramaters "Are Global variables initialised before static members ?"
I just logded on today on this site, and it was my first question, so did you receive the 75 points ?
Just a last point, you didn't answer concerning global paramaters "Are Global variables initialised before static members ?"
I just logded on today on this site, and it was my first question, so did you receive the 75 points ?
>> "Are Global variables initialised before
>> static members ?"
I answered, that but didn't paste in your question, which makes it more confusing. My answer was
>> They are initialized in the same sequence,
>> starting at the top of the translation unit.
>> (trivial initializations, like those for numerics,
>> may be done before, at compile time.)
So they are initialized intermixed.
>> did you receive the 75 points
150. A grade of C awards twice the question's point value. B three times, A four times.
If an answer is not satisfactory, you can try to reach a satisfactory answer with an expert _before_ grading, especially if the problem was that you didn't supply all the necessary information. Most questions are solved by a dialog between the expert and client, not a single response. This gives the the client the best opportunity to obtain a complete and satifactory answer and the expert a good grade.
>> static members ?"
I answered, that but didn't paste in your question, which makes it more confusing. My answer was
>> They are initialized in the same sequence,
>> starting at the top of the translation unit.
>> (trivial initializations, like those for numerics,
>> may be done before, at compile time.)
So they are initialized intermixed.
>> did you receive the 75 points
150. A grade of C awards twice the question's point value. B three times, A four times.
If an answer is not satisfactory, you can try to reach a satisfactory answer with an expert _before_ grading, especially if the problem was that you didn't supply all the necessary information. Most questions are solved by a dialog between the expert and client, not a single response. This gives the the client the best opportunity to obtain a complete and satifactory answer and the expert a good grade.
you want to do such thing? Maybe there is another
solution to your problem.