c++ - 可变大小的 char[] - 可以吗?

标签 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|错误:ISO C++ 禁止可变长度数组“缓冲区”|

现在,从我在这个论坛上读到的信息来看,Microsoft 只支持 C89,而 GCC 支持 C99,其中可变大小的数组是可以接受的。同样在该线​​程上,他们建议使用 _alloca() - 问题是,它最多只支持 1mb。我宁愿没有限制。

如果这是使它与 GCC/MSVC++ 交叉编译的唯一可能方法,我想我将不得不接受它。不过,很高兴知道一个替代方案。像 malloc() 这样的东西会起作用吗? (以前从未使用过,所以我不知道)如果是这样,你能告诉我如何使用它或链接到教程/文档吗?谢谢!

附言:这是我的 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); ... 返回 &buffer[0];char *buffer = new char[bufsize + 1];内存集(缓冲区,0,缓冲区大小); ... recv(sockfd, 缓冲区, bufsize, 0); ... 字符串 tmp = 缓冲区;删除 [] 缓冲区; return string(tmp); - 仍在安装 MSVC++ 以测试它,但我相信它会起作用。太感谢了! StackOverflow 摇滚!

最佳答案

g++ 允许 C++ 中的 C99 可变长度数组作为语言扩展。

标准 C++ 不支持它们。

在 C++ 中使用 std::vectorstd::string

干杯,

关于c++ - 可变大小的 char[] - 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5292498/

相关文章:

c++ - memset 和 struct 以及 getter/setter

C# I/O 与 C I/O

c++ - 函数指针的取消引用是如何发生的?

php - 如何选择多维数组中的第一个元素?

java - 我的随机数总是为零?

Python,我有一个猜谜游戏,想添加猜数

c++ - 如果我使用的是私有(private)结构,我如何将其声明为上面列出的公共(public)成员函数的参数?

javascript - 需要了解 Javascript Array.sort() 函数

javascript - 分配、混合、合并...与其他数组

javascript - Node.js http.request 结果作为变量返回