Udostępnij za pomocą


Błąd kompilatora C2482

"identifier" : dynamiczne inicjowanie danych "thread" niedozwolone w kodzie zarządzanym/WinRT

Uwagi

W kodzie zarządzanym lub WinRT zmienne zadeklarowane przy użyciu atrybutu modyfikatora klasy magazynu __declspec(wątku) lub specyfikatora klasy magazynu thread_local nie można zainicjować za pomocą wyrażenia, które wymaga oceny w czasie wykonywania. Wyrażenie statyczne jest wymagane do inicjowania __declspec(thread) lub thread_local danych w tych środowiskach środowiska uruchomieniowego.

Przykład

Poniższy przykład powoduje wygenerowanie błędu C2482 w kodzie zarządzanym (/clr) oraz w kodzie 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++

Aby rozwiązać ten problem, zainicjuj magazyn lokalny wątków przy użyciu wyrażenia stałego, constexprlub statycznego. Należy oddzielnie wykonać inicjację specyficzną dla wątku.