VS 2015 C++コンパイラでコンパイルすると警告が表示されます。std :: wcstok in 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とCの標準は、第三パラメータとその
それは呼び出しにわたって状態を追跡するために内部、スレッドごとのコンテキストを使用を導入したことに言及breaking changes in VS 2015、 strtokの場合は と同じです。関数は今では署名が
wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**)
であり、呼び出し元には が3番目の引数としてコンテキストを渡す必要があります。本質的に愚かな響きのコストで
、私はまだ先に行くと聞いて、 ます誰でも簡単な言葉で、この三番目のパラメータの目的を説明していただけますとどのようにそれはその以前のバージョンからstd::wcstok
を変更しましたか?
、それはは、strtodの最後のパラメータと同じです。これは解析される次の項目を保持しているので、次の呼び出しで最初のパラメータに渡すことができ、スレッドセーフになります。 – cup
グローバルCRT状態は非常に厄介なバグのためのレシピです。 strtok()は確かに悪いもの、errno、strerror()、asctime()、gmtime()、setlocale()、tmpfile()、tmpnam()、fcvt()、ecvt()のいずれかです。 –