这就是我想要做的事情:
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
答案 0 :(得分:6)
数组的大小是在编译时创建的。 strlen()
以及所有其他功能在运行时运行。
因此,编译器在const char search_path
的最终可执行文件中分配空格时,不知道该字符串的长度。
您需要执行以下操作之一:
使用sizeof
,就像const char search_path[sizeof(wav_folder) + 6];
一样(谢谢,伙计们!我忘记了......),
手动插入search_path.
的总长度。例如,
const char search_path[13];
,
在运行时动态分配一个数组(使用new
,当你完成它时,释放它占用new
对应delete
的内存。 1}} / delete[]
,
或 #define
searchpath
的必要长度。在编译时评估/替换宏。因此,您可以像这样定义必要的长度:
#define SEARCH_PATH_LEN 13
答案 1 :(得分:2)
如果要动态分配数组,则应该使用new operator new。 这是“堆栈”分配 - 您在声明它时不能使用函数来确定大小。
编译器希望事先知道大小 - 将它放在堆栈而不是堆上,当你使用函数时 - 它无法分辨大小是什么(在函数被调用之前。< / p>
答案 2 :(得分:2)
原因与第一个错误文本完全拼写 - “预期的常量表达式”
C / C ++中的数组声明需要[
和]
之间的常量表达式,即在编译时可以计算(计算)的表达式。 strlen()
的结果在编译时是未知的,因此无法使用(因为它是运行时函数),但您可以将其替换为sizeof()
:
const char search_path[sizeof(wav_folder) + 6];
编辑(以下评论)如果在堆栈上分配数组,则不需要常量表达式,但问题中的数组是在静态内存中分配的,因此出现此错误。其他有用的细节在NathanOliver的评论下面