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**)
이고 호출자 이 함수의 세 번째 인수로 컨텍스트를 전달해야합니다. 본질적으로 바보, 나는 여전히 가서 물어볼 것입니다 소리의 비용에서
std::wcstok
을 변경하는 방법을 간단한 용어에서이 세 번째 매개 변수의 목적을 설명하고 주시겠습니까?
, 그것의 strtod의 최후의 파라미터와 동일하다. 다음 호출시 첫 번째 매개 변수로 전달 될 수 있도록 다음 항목을 구문 분석하여 스레드 안전성을 높입니다. – cup
글로벌 CRT 상태는 매우 불쾌한 버그를 만드는 방법입니다. strtok()은 확실히 악의적 인 것들 중 하나입니다. errno, strerror(), asctime(), gmtime(), setlocale(), tmpfile(), tmpnam(), fcvt(), ecvt() –