Fur*_*ead 0 c++ arrays variables size iso
原谅我,如果这是愚蠢的但我更新的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’|
现在,从我在这个论坛上看到的是,微软只支持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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据建议,我打算使用vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0];OR 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摇滚!
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |