2016-07-01 9 views
6

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을 변경하는 방법을 간단한 용어에서이 세 번째 매개 변수의 목적을 설명하고 주시겠습니까?

+2

, 그것의 strtod의 최후의 파라미터와 동일하다. 다음 호출시 첫 번째 매개 변수로 전달 될 수 있도록 다음 항목을 구문 분석하여 스레드 안전성을 높입니다. – cup

+1

글로벌 CRT 상태는 매우 불쾌한 버그를 만드는 방법입니다. strtok()은 확실히 악의적 인 것들 중 하나입니다. errno, strerror(), asctime(), gmtime(), setlocale(), tmpfile(), tmpnam(), fcvt(), ecvt() –

답변

0

이전 버전은 strtok과 유사하며 마지막 토큰의 끝을 지나서 위치를 저장하기 위해 전역 스레드 로컬 저장소를 사용했습니다.

사용 된 접근법의 문제점은 strtok/wcstok과 같은 중첩 기능을 허용하지 않는다는 것입니다.

"r0c0;r0c1\nr1c0;r1c1" (2 행 2 열의 테이블) 같은 문자열이 있다고 가정하고 먼저 행을 분할 한 다음 각 행을 열로 분할하고 싶습니다.

이렇게하려면 2 개의 루프가 필요합니다. 오래된 접근 방식에서는 중첩 된 루프가 외부 루프의 상태를 덮어 쓰므로 불가능합니다. 새로운 방식으로 모든 루프는 별도의 변수에 저장된 개별 상태를 가질 수

#include <cwchar> 
#include <iostream> 

int main() 
{ 
    wchar_t input[] = L"r0c0;r0c1\n" 
         L"r1c0;r1c1"; 
    wchar_t *rowstate; 
    wchar_t *row = std::wcstok(input, L"\n", &rowstate); 

    while (row != nullptr) { 
     std::wcout << L"Row: " << row << std::endl; 

     wchar_t *colstate; 
     wchar_t *col = std::wcstok(row, L";", &colstate); 

     while (col != nullptr) { 
      std::wcout << " Col: " << col << std::endl; 
      col = std::wcstok(nullptr, L" ", &colstate); 
     } 

     row = std::wcstok(nullptr, L" ", &rowstate); 
    } 
} 

출력된다 : 추측에서

Row: r0c0;r0c1 
    Col: r0c0 
    Col: r0c1 
Row: r1c0;r1c1 
    Col: r1c0 
    Col: r1c1