【问题标题】:Why can't I use a function call to declare the length of an array?为什么我不能使用函数调用来声明数组的长度?
【发布时间】:2016-06-24 19:36:29
【问题描述】:

这就是我想要做的:

const char wav_folder[] = ".\\wav";
const char search_path[strlen(wav_folder) + 6];

但是 strlen 部分不允许我创建这个字符数组。这不是编译。为什么?

错误:

Error   1   error C2057: expected constant expression   c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   2   error C2466: cannot allocate an array of constant size 0    c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   3   error C2734: 'search_path' : const object must be initialized if not extern c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   4   error C2133: 'search_path' : unknown size   c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search

【问题讨论】:

  • 编译器怎么说?
  • Strlen 是一个函数。我不确定最近的 C 编译器(用于 C11)是否会允许它,但 sizeof() 已经工作了几十年。请注意以 0 结尾。
  • 同样的例子运行良好:en.cppreference.com/w/cpp/string/byte/strlen
  • 好吧,我似乎从这个微不足道的例子中学到了一些新东西。我对这个错误感到非常困惑。是的,我是电子工程师,不习惯写这段代码。
  • 您有兴趣接受您给出的 3 个答案之一吗?

标签: c++ arrays char strlen


【解决方案1】:

数组的大小是在编译时创建的。 strlen() 和所有其他函数在运行时运行。

因此,编译器在为const char search_path 分配最终可执行文件中的空间时,不知道字符串的长度。

您需要执行以下操作之一:

  • 使用sizeof,如const char search_path[sizeof(wav_folder) + 6];(谢谢,伙计们!我忘了...),

  • 手动插入search_path.的总长度例如,
    const char search_path[13];

  • 在运行时动态分配一个数组(使用new,当你完成它时,用new的对应物delete/delete[]释放它占用的内存,

  • #define searchpath 的必要长度。宏在编译时被评估/替换。因此,您可以像这样定义必要的长度:
    #define SEARCH_PATH_LEN 13

【讨论】:

  • #define dir_l_1 strlen(".\\wav") 根本不起作用
  • @quantum231:抱歉,我对这一点不太清楚。我已经编辑了我的答案以解释我的意思。基本上,const char search_path[ dir_l_1 + 6]; 在编译之前会变成const char search_path[ strlen(".\\wav") + 6];。如您所见,这不是您想要的。
【解决方案2】:

如果你想动态分配一个数组,你应该 new operator new。 这是“堆栈”分配 - 声明时不能使用函数来确定大小。

编译器想提前知道大小 - 把它放在堆栈上而不是堆上,当你使用函数时 - 它无法知道大小是多少(在调用函数之前。

【讨论】:

  • std::string 怎么样,这样我们以后就不用担心delete 了?
  • 我指的是使用函数在堆栈上声明一个数组。当然字符串会更容易使用。
【解决方案3】:

原因完全由第一个错误文本拼写 - “expected constant expression

C/C++ 中的数组声明需要在[] 之间的常量表达式,即可以在编译时评估(计算)的表达式。 strlen() 的结果在编译时是未知的,所以它不能被使用(因为它是运行时函数)但是你可以用 sizeof() 替换它:

const char search_path[sizeof(wav_folder) + 6];

EDIT (下面的cmets)如果数组是在堆栈上分配的,则不需要常量表达式,但是问题中的数组是在静态内存中分配的,因此会出现此错误。其他有用的细节在下面 NathanOliver 的评论中

【讨论】:

  • 在 C/C++ 中声明数组需要在 [ 和 ] 之间进行常量表达式 这不适用于标准中包含 VLA 的 C11。
  • @NathanOliver 感谢您提供此信息,我不知道,将搜索和学习。但是,很明显 OP 的编译器(或其设置)不支持此 VLA - 错误文本清楚地表明了这一点,正如我在回答中提到的那样
  • 是的。我只是想指出,C 现在允许“静态”数组的运行时大小。
  • @NathanOliver 谷歌搜索我发现here 甚至 C99 也支持 VLA,现在我记得几年前我自己使用过它......这使我的答案错误,我现在会编辑它
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2018-06-30
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多