FIX: LNK2001 Incorrectly Generated for Static Data Member

ID: Q149784


The information in this article applies to:
  • The C/C++ Compiler (CL.EXE), included with:
    • Microsoft Visual C++, 32-bit Editions, version 4.0


SYMPTOMS

When declaring static members of C++ classes, you must initialize the static data member. Otherwise the linker generates an unresolved external error message. Visual C++ 4.0 incorrectly generates such an unresolved external error message if a storage-class specifier (such as __declspec(X)) is used on the initialization line of a static data member.


CAUSE

Storage-class specifiers, such as __declspec(), are only necessary for declarations. They are not needed (but are not wrong) otherwise.


RESOLUTION

Remove the storage-class specifier.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem has been corrected in Microsoft Visual C++ version 4.1.


MORE INFORMATION

Earlier versions of Visual C++ generated the following error when a storage- class specifier is used on the initialization line:


C:test.cpp('line') : error C2720: 'idata' : '' storage-class specifier
                 illegal on members 
where 'line' is the line of code where the initialization takes place, and 'idata' is the name of the static data member. Visual C++ no longer generates the C2720 error (correctly so). The following sample code demonstrates the problem.

Sample Code


/* Compile options needed: none
*/ 

#include <iostream.h>
#include <stdio.h>

class A
{
  public:
    static __declspec(thread) int idata;
    void test(void);
};
__declspec(thread) int  A::idata = 2;  // remove this __declspec(thread) to
                                       // eliminate unresolved external
error

void A::test(void)
{
  cout<<idata;
}
void main(void)
{
  A theA;
  theA.test();
} 

Additional query words: 4.00 lnk2001 lnk1120 L2029 unresolved external LINK

Keywords : kbCompiler kbCPPonly kbVC
Version : 4.00
Platform : NT WINDOWS
Issue type :


Last Reviewed: September 10, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.