编译器错误 C2482

“identifier”:托管/WinRT 代码中不允许线程数据的动态初始化

备注

在托管代码或 WinRT 代码中,使用 __declspec (thread) 存储类修饰符特性或 thread_local 存储类说明符声明的变量不能使用需要在运行时计算的表达式进行初始化。 在这些运行时环境中初始化 __declspec(thread)thread_local 数据需要静态表达式。

示例

以下示例在托管 (/clr) 和 WinRT (/ZW) 代码中生成 C2482:

// 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++

若要解决此问题,请使用常数、constexpr 或静态表达式来初始化线程本地存储。 单独执行任何特定于线程的初始化。