Article ID: 152211
Article Last Modified on 7/5/2005
APPLIES TO
- Microsoft Visual C++ 4.1 Subscription
- Microsoft Visual C++ 4.2 Enterprise Edition
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 6.0 Enterprise Edition
- Microsoft Visual C++ 4.2 Professional Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 6.0 Professional Edition
- Microsoft Visual C++ 6.0 Standard Edition
This article was previously published under Q152211
SYMPTOMS
The constructor gets called more than once on the same global object.
CAUSE
This error occurs when a file has both a global object and a function that references the global object as extern. In this case, the compiler incorrectly generates code that calls the constructor on the "extern myClass object;" statement.
RESOLUTION
Remove the line that contains extern reference to the global. You can safely remove this line since the global is in file scope.
-or-
Create two separate files, one that contains the global object, and one that contains the function that references the global object as extern.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
This problem was corrected in Microsoft Visual C++ .NET.
MORE INFORMATION
Sample Code
// This sample demonstrates the problem of the constructor getting // called twice. /* Compile options needed: cl test.cpp */ // TEST.CPP // ======== #include "stdio.h" class myClass { public: myClass() {printf("myClass Constructor called\n");}; void test() {printf("test() called\n");}; } object; void main() { // Remove the next line for the first workaround: extern myClass object; object.test(); } // sample output: (without extern line removed) myClass Constructor called myClass Constructor called test() called // This sample demonstrates the workaround that causes the program // to only call the constructor once. /* Compile options needed: cl Test2A.cpp Test2B.cpp */ // Test2.h // ======== #include "stdio.h" class myClass { public: myClass() {printf("myClass Constructor called\n");}; void test() {printf("test() called\n");}; }; // Test2A.cpp // ========== #include "Test2.h" myClass object; // Test2B.cpp // ========== #include "Test2.h" void main() { extern myClass object; object.test(); } // sample output: myClass Constructor called test() called
Additional query words: 10.10 10.20
Keywords: kbbug kbfix kbnoupdate kbcpponly kbcompiler KB152211