在视觉C++中必须具有常量值

Must have const value in Visual C++

本文关键字:常量 视觉 C++      更新时间:2023-10-16

我有这个代码:

std::string name = "kingfisher";
char node_name[name.size()+1];
strcpy(node_name,name.c_str());
node_name[name.size()] = '';

它在 DevC++ 中运行良好,但在 Visual C++ 中,我遇到了一个名为"name.size() 必须是常量值"的问题!如何解决问题?我知道我必须在声明中使用 node_name 的 const 值,但有时(如上述情况)我不能!谢谢!

char node_name[name.size()+1];

由于name.size()的值在编译时是未知的,因此在上面的声明中,node_name是ISO C++中不允许的可变长度数组(VLA)。

在 DevC++ 中,它可以编译和工作,因为它提供 VLA 功能作为扩展,该功能在编译配置中启用。

使用std::stringchar *new[]/delete[]一起使用,任何适合您需要的东西。

在你的特定情况下,即如果你已经知道字符串文字,那么你可以这样写:

char node_name[] = "kingfisher"; //this works great!

但是,如果字符串值未知,并且您想从某个位置复制它,请执行以下操作:

char *node_name = new char[name.size()+1];
std::strncpy(node_name, name.c_str(), name.size()+1); //use strncpy
//work with node_name
//must deallocate the memory
 delete []node_name; //not `delete node_name;`

使用 std::strncpy 而不是 std::strcpy ,因为前者也将缓冲区大小作为第三个参数,如上所示,而后者则不然(这通常是不安全的;但在这种情况下并非如此)。

可变长度数组不是标准C++的一部分。您需要在编译时给出大小。 name.size()将在运行时发生。注释应该足以解释幻数或常数。

char node_name[11]; //length of "kingfisher" + null

如果你在编译时不知道字符串的长度(但在你的例子中知道),你可以使用动态数组,正如 Nawaz 的答案中解释得很好。

有很多选择:

std::string name = "kingfisher";
char* node_name = alloca(name.size() + 1);
strcpy(node_name, name.c_str());
// no need to explicitly set the '' - strcpy copies it too
...OR...
char* node_name = new char[name.size() + 1];
strcpy(node_name, name.c_str());
...OR...
char* node_name = strdup(name.c_str());  // allocate on malloc/free/realloc "C" heap
...OR...
std::vector<char> node_name(name.data(), name.data() + name.size()); // sans ''
...OR...
std::vector<char> node_name(name.c_str(), name.c_str() + name.size() + 1); // with ''
...OR...
std::string node_name = node;  // do something with node_name.c_str() / .data() etc.

注意:尽管 Ernest 对 Stefan 删除的答案有"不要在C++中使用 malloc(),请使用 new[]"的评论,但它可能是必要的 - 例如,当传递指向可能重新分配或释放内存的 C 代码的指针时。

运行时确定大小的数组称为可变长度数组VLA。VLA 是 C99 中的一个功能。一些C++编译器支持它们作为扩展,有些则不支持;听起来您的视觉C++版本没有。

您始终可以使用 new 动态分配node_name,而不是在堆栈上。

我的第一个方法是查看您使用数组的目的,并询问是否有更好的方法。

如果你真的需要数组,我建议一个向量:它是动态大小的,但不需要删除。

    std::string name = "kingfisher";
    std::vector<char> name_buff(name.begin(), name.end());
    name_buff.push_back(0);  // nul-terminate
    char *node_name = &name_buff[0];
    // ...