DOCUMENT:Q149784 30-JUL-2001 [visualc] TITLE :FIX: LNK2001 Incorrectly Generated for Static Data Member PRODUCT :Microsoft C Compiler PROD/VER:4.00 OPER/SYS: KEYWORDS:kbCompiler kbCPPonly kbVCkbbuglist kbfixlist ====================================================================== ------------------------------------------------------------------------------- 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 #include 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<