2012-06-12 43 views
0

我正在嘗試編寫一個處理非常長的消息(它處理聊天系統)的套接字系統。我正在嘗試使用const int來初始化一個數組,這個數組是可以編譯的,但我被警告ISO C++禁止它。有人可以看到這種情況嗎? (這是爲了避免寫一個字節剩餘的多接收系統(我已經有了,但是我覺得這會更有效率))。下面是一個如何使用它的例子。C++變量數組

const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call 
     if(BUFFERLEN != -1) { //it returns "-1" on error 
      char INBUFFER[BUFFERLEN]; 
      recv(SOCK,INBUFFER,sizeof(INBUFFER),0); 
     } 

這樣做可以接受嗎?還是應該堅持使用multi-recieve-until-done方法?

謝謝, 科林

+0

要麼做多個較小的接收,要麼動態分配緩衝區。 –

回答

5
const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call 
     if(BUFFERLEN != -1) { //it returns "-1" on error 
      std::vector<char> INBUFFER(BUFFERLEN); 
      recv(SOCK,INBUFFER.data(),INBUFFER.size(),0); 
     } 
+0

非常感謝發佈的所有人,我現在明白了。我甚至沒有意識到我可以使用矢量從套接字接收數據,這正是我需要的。我一直以C風格編寫大部分代碼,因爲我還沒有學到一些更有用的STL特性。 –

2

當使用C++陣列的大小必須在編譯時是已知的。否則,您需要使用動態分配。 const並不一定意味着BUFFERLEN是一個編譯時間常量。

1

我想使用一個const int來初始化一個數組,但是編譯,但我被警告ISO ISO禁止它。有人可以看到這種情況嗎?

這是因爲在程序中const int實際上不是恆定表達(其在編譯時已知的值),這意味着在程序中聲明的數組是可變長度數組(VLA),其中不允許ISO C++。你的程序編譯是因爲你的編譯器提供了VLA作爲擴展。

你可以使用什麼叫做std::vector<char>

所以取而代之的,

char INBUFFER[BUFFERLEN]; //old code 

可以使用

std::vector<char> INBUFFER(BUFFERLEN); //new code 

,而不是和,

recv(SOCK,INBUFFER,sizeof(INBUFFER),0); //old code 

你可以寫:

recv(SOCK, &INBUFFER[0], INBUFFER.size(),0); //new code 
0

C++ 98不允許可變長度數組。不要緊,你的int是一個「const」,因爲大小不能事先確定。圍繞char *創建一個包裝來管理自己內存的分配和未分配是一個可接受的解決方案。