[英]Variable sized char[] - Is it OK?
如果這很愚蠢,請原諒我,但我是C / C ++的新手。
在我創建的套接字庫中,我的ClientSocket :: recv(int bufsize)函數使用'bufsize'初始化char []數組以從C套接字讀取。 只要使用G ++進行編譯,該代碼就可以正常工作。
我遇到的問題是正在編譯我的代碼的某些人遇到以下錯誤: socket.cxx||In member function 'std::string ClientSocket::recv(int)':| socket.cxx|269|error: ISO C++ forbids variable length array 'buffer'|
socket.cxx||In member function 'std::string ClientSocket::recv(int)':| socket.cxx|269|error: ISO C++ forbids variable length array 'buffer'|
現在,根據我在該論壇上看到的內容,Microsoft僅支持C89,而GCC支持C99,其中可接受大小可變的數組。 同樣在該線程上,他們建議使用_alloca()-問題是,它僅支持1mb。 我寧願沒有限制。
如果那是使其與GCC / MSVC ++交叉編譯的唯一可能方法,我想我將不得不忍受它。 很高興知道替代方法。 像malloc()這樣的東西可以工作嗎? (以前從未使用過,所以我不知道)如果是這樣,請您告訴我如何使用它或鏈接到教程/文檔? 謝謝!
PS:這是我的recv()函數的代碼:
std::string ClientSocket::recv(int bufsize) {
// isConnected() is a ClientSocket function
if (!isConnected()) throw SocketException("Not connected.");
char buffer[bufsize+1];
// I did this because sometimes it was returning partial garbage :\
memset(buffer, 0, bufsize);
// the :: prefix means to call the recv() from the header files instead of ClientSocket::recv()
int ret = ::recv(sockfd, buffer, bufsize-1, 0);
if (ret < 0) {
switch(errno) {
case ECONNREFUSED:
throw SocketException("Connection refused on recover.");
break;
case ENOTCONN:
throw SocketException("Not connected.");
break;
default:
throw SocketException("Unknown error reading socket.");
break;
}
} else if (ret == 0) {
// we got disconnected, return empty string. (connected is a protected variable of ClientSocket)
connected = false;
return "";
}
return buffer;
}
編輯:根據建議,我計划使用vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0];
vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0];
或char *buffer = new char[bufsize + 1]; memset(buffer, 0, bufsize); ... recv(sockfd, buffer, bufsize, 0); ... string tmp = buffer; delete [] buffer; return string(tmp);
char *buffer = new char[bufsize + 1]; memset(buffer, 0, bufsize); ... recv(sockfd, buffer, bufsize, 0); ... string tmp = buffer; delete [] buffer; return string(tmp);
-仍在安裝MSVC ++以便對其進行測試,但我相信它會起作用。 非常感謝! StackOverflow搖滾!
g ++允許使用C ++中的C99可變長度數組作為語言擴展。
標准C ++不支持它們。
在C ++中,請使用std::vector
或std::string
。
干杯,……
嘗試這樣做:
char * buffer = new char[bufsize + 1];
我將創建一個簡單的緩沖區類,該緩沖區類包裝了char *
來處理此問題。 它將使用new
來分配緩沖區。 我相信也可以使用vector
並且仍然符合標准。 但是我不確定如何以推薦的方式進行操作。
您甚至不需要使用memset,如果您使用的是gcc或g ++,則可以使用char類型的常規聚合實際上將其全為零,請考慮以下幾點:
char * buffer[bufsize+1] = {0};
該代碼僅在gcc / g ++中有效,因為gcc允許在堆棧上使用可變大小的數組。
您唯一的其他選擇是使用:
char * buffer = new char[bufsize+1];
// and assign it zeros with std::fill
std::fill(buffer, buffer+bufsize+1, 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.