0

我正在尝试编写一个处理极长消息的套接字系统(它处理一个聊天系统)。我正在尝试使用 const int 来初始化一个可以编译的数组,但我被警告 ISO 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);
       }

这完全可以接受吗,还是我应该坚持使用多次接收直到完成的方法?

谢谢,科林

4

4 回答 4

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);
       }
于 2012-06-12T07:39:43.670 回答
2

当您使用 C++ 数组时,必须在编译时知道大小。否则,您需要使用动态分配。const并不一定意味着这BUFFERLEN是一个编译时间常数。

于 2012-06-12T07:40:20.350 回答
1

我正在尝试使用 const int 来初始化一个可以编译的数组,但我被警告 ISO C++ 禁止它。有人可以说明情况吗?

这是因为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
于 2012-06-12T07:41:32.760 回答
0

C++ 98 不允许变长数组。您的 int 是“const”并不重要,因为无法提前确定大小。围绕 char* 创建一个包装器来管理其自身内存的分配和取消分配是一种可接受的解决方案。

于 2012-06-12T07:42:50.810 回答