У меня этот тонированный использованный код кода, который при компиляции с компилятором VS 2015 C++ выдает предупреждение.std :: wcstok в 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" ");
}
}
Это привело к следующим предупреждениям.
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'
Глядя в Интернете, я читал о std::wcstok и breaking changes in VS 2015, который отмечает, что стандарт C ввел третий параметр и что
Он используется внутренний, для каждого треда контекста для отслеживания состояния между вызовами, как делается для strtok. Функция теперь имеет подпись
wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**)
и требует, чтобы вызывающий абонент передал контекст в качестве третьего аргумента функции.
Цены звучащего по своей сути глупо, я все равно буду идти вперед и спросить, Может кто-нибудь, пожалуйста, объясните цель этого третьего параметра в простых терминах, и как она изменилась std::wcstok
от его предыдущей версии?
На догадке, он такой же, как последний параметр strtod. Он удерживает следующий элемент для анализа, поэтому его можно передать в первый параметр при следующем вызове, который сделает его потокобезопасным. – cup
Глобальное состояние CRT - это рецепт для очень неприятных ошибок. strtok(), безусловно, является одним из наиболее злых, errno, strerror(), asctime(), gmtime(), setlocale(), tmpfile(), tmpnam(), fcvt(), ecvt() заслуживают почетного упоминания. –