2013-04-24 37 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++(並且微軟無論如何都沒有實現C99,因此在它的C模式下也沒有使用VLA)。

如果您要編譯爲C++,您可能希望將其從數組更改爲std::vector,因此指定非編譯時常量的大小不再是問題。

0

如果你想繼續使用靜態緩衝區(這更好,儘管我同意Jerry的說法,std::vector是要走的路),用MB_LEN_MAX代替。