C++变量数组

C++ Variable Array

本文关键字:数组 变量 C++      更新时间:2023-10-16

我正在尝试编写一个用于处理极长消息的套接字系统(它处理聊天系统)。我正在尝试使用 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);
       }

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

谢谢科林

 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);
       }

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

我正在尝试使用 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

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