Compiler Error C2482

'identifier' : dynamic initialization of 'thread' data not allowed in managed/WinRT code

Remarks

In managed or WinRT code, variables declared by using the __declspec(thread) storage class modifier attribute or the thread_local storage class specifier cannot be initialized with an expression that requires evaluation at run-time. A static expression is required to initialize __declspec(thread) or thread_local data in these runtime environments.

Example

The following sample generates C2482 in managed (/clr) and in WinRT (/ZW) code:

// C2482.cpp
// For managed example, compile with: cl /EHsc /c /clr C2482.cpp
// For WinRT example, compile with: cl /EHsc /c /ZW C2482.cpp
#define Thread __declspec( thread )
Thread int tls_i1 = tls_i1;   // C2482

int j = j;   // OK in C++; C error
Thread int tls_i2 = sizeof( tls_i2 );   // Okay in C and C++

To fix this issue, initialize thread-local storage by using a constant, constexpr, or static expression. Perform any thread-specific initialization separately.