Mam ten stonowany używany przypadek kodu, który po skompilowaniu z kompilatorem VS 2015 C++ generuje ostrzeżenie.std :: wcstok w VS 2015
#include <cwchar>
#include <iostream>
int main()
{
wchar_t input[100] = L"A bird came down the walk";
wchar_t* token = std::wcstok(input, L" ");
while (token) {
std::wcout << token << '\n';
token = std::wcstok(nullptr, L" ");
}
}
Wykonano następujące ostrzeżenia.
warning C4996: 'wcstok': wcstok has been changed to conform with the ISO C standard, adding an extra context parameter. To use the legacy Microsoft wcstok, define _CRT_NON_CONFORMING_WCSTOK.
1> c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\corecrt_wstring.h(254): note: see declaration of 'wcstok'
warning C4996: 'wcstok': wcstok has been changed to conform with the ISO C standard, adding an extra context parameter. To use the legacy Microsoft wcstok, define _CRT_NON_CONFORMING_WCSTOK.
1> c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\corecrt_wstring.h(254): note: see declaration of 'wcstok'
Patrząc online, czytałem o std::wcstok i breaking changes in VS 2015 który wspomina, że standard C wprowadzono trzeci parametr i że
Stosowany wewnętrzną, kontekst per-thread śledzić stan całej rozmowy, jak dla strtok. Funkcja ma teraz podpis
wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**)
i wymaga, aby wywołujący przekazał kontekst jako trzeci argument funkcji.
Kosztem brzmiące natury głupi, będę nadal iść do przodu i zapytać, Może ktoś proszę wyjaśnić cel tego trzeciego parametru w prostych słowach i jak to się zmieniło std::wcstok
z jego wcześniejszej wersji?
na oko, to jest taki sam jak ostatni parametr strtod. Przechowywany jest kolejny element, który można przeanalizować, aby można go było wprowadzić do pierwszego parametru podczas następnego połączenia, co spowodowałoby, że wątek byłby bezpieczny. – cup
Globalny stan CRT to przepis na bardzo paskudne błędy. strtok() jest z pewnością jednym z bardziej złych, errno, strerror(), asctime(), gmtime(), setlocale(), tmpfile(), tmpnam(), fcvt(), ecvt() zasługują na wyróżnienie. –