Compartilhar via


Erro do compilador C2482

'identificador': inicialização dinâmica de dados de “thread” não permitida em código gerenciado/WinRT

Comentários

No código gerenciado ou WinRT, as variáveis declaradas usando o atributo modificador de classe de armazenamento __declspec(thread) ou o especificador da classe de armazenamento thread_local não podem ser inicializadas com uma expressão que requer avaliação em tempo de execução. Uma expressão estática é necessária para inicializar dados de __declspec(thread) ou thread_local nesses ambientes de runtime.

Exemplo

O exemplo a seguir gera C2482 no código gerenciado (/clr) e no código WinRT (/ZW):

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

Para corrigir esse problema, inicialize o armazenamento local de thread usando uma constante constexpr ou uma expressão estática. Execute qualquer inicialização específica do thread separadamente.