2013-04-24 4 views
0

난 그냥 cplusplus에서 일부 코드를 복사하고 wctomb의 테스트 프로그램을 실행왜 MB_CUR_MAX가 정의되지 않았습니까?

/* wctomb example */ 
#include <stdio.h>  /* printf */ 
#include <stdlib.h>  /* wctomb, wchar_t(C) */ 

int main() { 
    const wchar_t str[] = L"wctomb example"; 
    const wchar_t* pt; 
    char buffer [MB_CUR_MAX]; 
    int i,length; 

    pt = str; 
    while (*pt) { 
    length = wctomb(buffer,*pt); 
    if (length<1) break; 
    for (i=0;i<length;++i) printf ("[%c]",buffer[i]); 
    ++pt; 
    } 

    return 0; 
} 

그러나, 프로그램을 컴파일 할 수없는 MB_CUR_MAX는 지금까지 내 컴파일러 (VC 2010)로 간주됩니다 정의되지 않은 때문이다. 내가 뭘해야하는지 궁금해서. 감사!

error C2057: expected constant expression 
error C2466: cannot allocate an array of constant size 0 
error C2133: 'buffer' : unknown size 

답변

3

MB_CUR_MAX이 함수 호출 #define MB_CUR_MAX ___mb_cur_max_func()으로 정의된다, 그래서 당신은 런타임 동적 배열을 할당 계산해야합니다.

3

많은 사전 프로세서 정의 숫자와 달리, MB_CUR_MAX는 이 아니며 상수 일 필요는이 아닙니다. 사실, 로케일에 의존하기 때문에 컴파일 타임 상수가 될지 모르겠습니다.

MS가 좋아 정의

#ifndef MB_CUR_MAX 
#define MB_CUR_MAX ___mb_cur_max_func() 

당신이 C99이나 C11에서 합법적 인 것 위 줄의 코드를 char buffer [MB_CUR_MAX];는 가변 길이 배열 될 경우 - 그러나 태그를 기반으로, 당신은있어 VLA를 포함하지 않는 C++로 컴파일하려고합니다. Microsoft는 C99를 구현하지 않으므로 C 모드에서도 VLA를 사용할 수 없습니다.

C++로 컴파일하려는 경우 배열에서 std::vector으로 변경하려는 것이므로 컴파일 타임 상수가 아닌 크기를 지정하는 것이 더 이상 문제가되지 않습니다.

0

안정적인 버퍼를 계속 사용하려면 (std::vector은 Jerry와 동의하지만 더 좋음) MB_LEN_MAX을 대신 사용하십시오.

관련 문제