простите, если это глупо, но я новичок в 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’|
Теперь из того, что я прочитал на этом форуме, является то, что Microsoft поддерживает только C89, тогда как GCC поддерживает C99, в котором допустимы массивы переменного размера. Также в этом потоке они предложили использовать _alloca () - проблема в том, что поддерживается только до 1 МБ. Я бы предпочел, чтобы не было предела.
Если это единственный возможный способ сделать его кросс-компилируемым с GCC / MSVC ++, я думаю, мне придется с этим смириться. Хотя было бы неплохо узнать альтернативу. Будет ли что-то вроде malloc () работать? (никогда не использовал его раньше, поэтому я не знаю) Если это так, не могли бы вы сказать мне, как использовать его или ссылку на учебник / документы? Спасибо!
P.S .: Вот код для моей функции 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];
ИЛИ 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 ROCKS!