2012-06-12 44 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 *创建一个包装来管理自己内存的分配和未分配是一个可接受的解决方案。