2010-12-01 2 views
0

지금 GCC 및 다른 컴파일러 (있는 경우)로 알려진 wcstok()의 재진입 버전을 찾고 있습니다.X 플랫폼 재진입 wcstok()?

지금까지 wcstok_s()을 사용했지만 그 중 하나는 MSVC이고 다른 플랫폼에서도 코드를 컴파일해야합니다. 일부 페이지는 wcstok_r()을 제안하지만 GCC 헤더에서 찾을 수 없습니다. 다른 (사람) 페이지에는 특정 와이드 char 버전이없는 strtok_s()이 나와 있지만 멀티 바이트 문자열 (?)에만 사용한다고 언급되어 있습니다.

그래서 제안을받을 수 있습니다. 내 자신의 래퍼/버전을 작성하는 것은 해결책으로 만 마지막 방법이 될 것입니다. aschepler에 대한

편집 : - :

#include <cwchar> // includes wchar.h as well 

int main(void) 
{ 
    wchar_t *a, *b, *c; 
    wcstok(a, b, &c); 
    return 0; 
} 
+0

이 문제를 해결하기위한 해결 방법을 추가했습니다. C89에서 2 매개 변수 wcstok를 정의하고 3 매개 변수 1을 나중에 90 년대에 추가 한 것처럼 보입니다. 전반적으로 매우 혼란 스럽습니다. 특히 GCC에서도 일치하지 않기 때문에 더욱 그렇습니다. . – Mario

답변

0

C89 (따라서 C++)로 지정된 기능 wcstok를 재진입과 같은있다 too many arguments 때문에 컴파일되지 않습니다 샘플 코드는 무의미에도 불구하고 컴파일한다 서명 및 Microsoft의 wcstok_s과 본질적으로 동일한 동작입니다. wcstok<wchar.h> 및/또는 <cwchar>으로 선언해야합니다.

wchar_t* wcstok(wchar_t* s, const wchar_t* delim, wchar_t** ptr); 

그러나 Microsoft의 wcstok에는 잘못된 서명이있는 것으로 보입니다.

Windows에서 gcc를 사용하는 경우에도이 문제가 발생하면 #ifdef _WINDOWS (#ifdef _MSC_VER 대신)을 사용하여 사용할 함수를 결정할 수 있습니다.

+0

추가 정의가 필요합니까? Mine (Win32의 GCC 4.5.0)은 3 개의 인수를 취하지 않습니다. ('error : 함수'wchar_t * wcstok (wchar_t *, const wchar_t *) '에 대한 함수가 너무 많습니다. 시도 할 첫 번째 시도 중 하나였습니다. – Mario

+0

@Mario - 편집을 참조하십시오. – aschepler

+0

호출 할 올바른 함수를 정의하는 데 아무런 문제가 없습니다. MinGW의 include 파일은 재진입이 불가능한 버전 만 제공합니다 (전처리 된 코드 파일 확인). GCC를 사용하여 Win32 용 컴파일을 "스크루"할 수는 있지만 깨끗한 솔루션처럼 들리지는 않습니다. 작은 테스트 프로그램을 추가하여 다른 코드가 아닌지 확인했습니다 ... – Mario