2010-08-14 67 views
4

我已經使用code :: blocks將一些代碼從Mingw移植到Visual Studio及其編譯器,它已經發現了很多錯誤,我的數組大小必須是不變的!爲什麼VS需要一個恆定的大小,而mingw不需要?VS爲什麼要求數組大小不變,而MinGW不需要?有沒有辦法解決它?

例如

const int len = (strlen(szPath)-20); 
char szModiPath[len]; 

的LEN變量紅色下劃線地說,它的錯誤,並說「希望是常量表達式」

我能想到的來解決這個問題的唯一途徑....

char* szModiPath = new char[len]; 
delete[] szModiPath; 

我將不得不改變一切動態或VS有另一種方式嗎?

+4

好的,所以mingw一直在愚弄我思考其實際有效的C++代碼!但它不是,能夠做到這一點雖然有用... – Kaije 2010-08-14 14:11:32

回答

5

爲什麼VS需要恆定的大小,而mingw不?

由於可變長度數組不是C++的一部分,儘管MinGW(g ++)支持它們作爲擴展。 數組大小在C++中必須是一個常量表達式。

在C++中,總是推薦使用std::vector而不是C-style arrays。 :)

6

我能想到的來解決這個問題的唯一途徑....

這不是「的唯一途徑」。使用STL容器。

#include <string> 

.... 
std::string s; 
s.resize(len); 

#include <vector> 

.... 

std::vector<char> buffer(len); 

附:另外,我不認爲在C++代碼中使用匈牙利符號是一個好主意。

+0

它只是發生我的例子是使用字符串,我也使用整數和類的數組:P和加我做的Windows編程,所以我prefere使用null終止字符串,以便我可以將它們傳遞給Windows API函數/調用,並且我認爲std :: string的.c_str()成員是常量,所以我不能總是將它傳遞給Windows函數。 – Kaije 2010-08-14 14:00:24

+1

@kaije:如果你想將緩衝區傳遞給windows函數進行寫入,一個向量仍然可以自動執行內存管理,'&vec [0]會給你指向緩衝區的指針。如果你想避免動態分配,那麼使用各種常量,比如windows定義的'MAX_PATH'等。 – UncleBens 2010-08-14 14:47:49

+0

@kaijethegreat:沒有理由讓自己處於需要手動釋放某些東西的位置。使用一個容器,它會一直爲你做。 – GManNickG 2010-08-14 19:14:39

0

使用_alloca從堆棧中分配變量,然後編寫一個封裝類。這很麻煩,但是你可以編寫自己的基於棧的可變長度數組。

相關問題