2010-03-19 66 views
0

我正在使用gcc編譯器在Linux上的Netbeans上開發一個程序,當在Windows 7上切換到Visual C++時,代碼無法編譯,因爲Visual C++在多行上顯示它爲expected constant expression。 NetBeans上,我壓根兒類似char name[fullName.size()];的東西,而在VISUAL C++,我試過了,除其他事項外,用常量創建數組

const int position = fullName.size(); 
char Name[position]; 

如何創建一個常數使用的陣列?

注:我知道關於this question,但是有沒有什麼辦法可以在不使用向量的情況下使用這個工作,因爲那需要重寫程序的很多部分?

+1

這裏的實際問題是「如何在堆棧上創建一個非預定大小的數組?」答案是,你不能用VC++。 – 2010-03-19 21:41:44

+0

什麼是fullname.size()?看起來像一個函數調用,這將是運行時調用,因此不是一個常量表達式。 – 2010-03-19 21:42:13

+0

fullname.size()是字符串的長度。這是一個函數調用 – wrongusername 2010-03-19 21:45:59

回答

1

在VC++中,不能做堆疊陣列尺寸的運行時的聲明,但你可以通過_alloca

做堆棧分配這樣的:

const int position = fullName.size(); 
char Name[position]; 

變成這樣:

const int position = fullName.size(); 
char * Name = (char*)_alloca(position * sizeof(char)); 

這不是完全相同的事情,但它和你將要用VC++獲得的一樣。

+4

我認爲我們應該引導問題走向堆......我不想看到一個初學者開始用_alloca – 2010-03-19 21:49:00

+0

編寫代碼@George:堆可能是一個更好的選擇,但對於一個簡單的字符串緩衝區,這是一個更糟糕的選擇。 – 2010-03-19 21:57:27

+0

爲什麼不使用std :: string?他說他是初學者,這是最容易使用的東西。 – 2010-03-19 22:07:41

2

這在VC++中是不可能的。我知道,相當難過:(

的解決方案包括:

  • 堆上
  • 創建它讓它不斷

新的C++標準(C++ 0x中)提出了一種'constant expression'功能來解決這個問題,更多的信息請查看this out。

+0

謝謝!我不能讓它保持不變,因爲我不知道字符串的大小。 「在堆上創建它」是什麼意思?對不起,我仍然是編程的新手。 – wrongusername 2010-03-19 21:46:47

+0

使用'new'分配內存並用'delete'釋放 – 2010-03-19 21:49:21

+1

這意味着使用'vector'。有*沒有*理由有原始內存分配懸而未決,他們泄漏,讓你的生活更加困難。 – GManNickG 2010-03-19 22:03:27

1

C++要求在編譯時知道數組的大小如果你不介意使用g是一個非標準的擴展,gcc確實允許像你這樣做的代碼(注意雖然它不是標準的C++,但它在C中爲標準,從C99開始)。我也猜測你可以使用一個向量(在這個特定的地方),比你想象的更麻煩 - 雖然爲數組編寫的相當一部分代碼只能使用一個向量,編譯,很少或根本不重寫。

0

你的char name[fullName.size()];是一個variable-length array的例子 - 據我所知 - 在C++中沒有標準化,所以你受編譯器的支配。 [稍微偏離主題他們是C99標準的一部分]