C++ C++;禁止可变大小数组

C++ C++;禁止可变大小数组,c++,C++,我正在使用其他人编写的一些现有代码,但我无法将其编译(这里的C经验有限,但我正在努力学习!) 实用程序。cc #include "utilities.h" FILE *open_file(char *filename, const char*extension, const char *access) { char string[MAX_STR_LEN]; FILE *strm = NULL; if(filename[0]=='\0') { printf("\n

我正在使用其他人编写的一些现有代码,但我无法将其编译(这里的C经验有限,但我正在努力学习!)

实用程序。cc

#include "utilities.h"
FILE *open_file(char *filename, const char*extension, const char *access)
{
  char string[MAX_STR_LEN];
  FILE *strm = NULL;

  if(filename[0]=='\0')
   {
      printf("\n INPUT FILENAME (%s) > ",access);
      fgets(string,MAX_STR_LEN,stdin);
      sscanf(string,"%s",filename);
      printf(" FILE %s opened \n", filename);
   }
   int len=strlen(filename);

   if( len + strlen(extension) >= MAX_STR_LEN)
   {
      printf("\n ERROR: String Length  of %s.%s Exceeds Maximum",
              filename, extension);
      return(NULL);
   } 

   // char *filename1 = new(char[len+strlen(extension)+1]);

   const int filenameLength = len+strlen(extension)+1;
   char *filename1 = new(char[filenameLength]);

   strcpy(filename1,filename); // temp filename for appending extension

   /* check if file name has .extension    */
   /* if it does not, add .extension to it */
   int i=len-1;
   while(i > 0 && filename[i--] != '.');
   //   printf("\n Comparing %s to %s", extension, filename+i+1);
   if(strcmp(extension, filename+i+1)  )
      strcat(filename1,extension);
   if( (strm = fopen(filename1, access) ) == NULL )
   {
      printf("\n ERROR OPENING FILE %s (mode %s)", filename1,access);
   }
   delete(filename1);
   return(strm);
}
这里是错误

Compiling utilities.cc ...
src/utilities.cc: In function ‘FILE* open_file(char*, const char*, const char*)’:
src/utilities.cc:251: error: ISO C++ forbids variable-size array
gmake: *** [/home/landon/geant4/work/tmp/Linux-g++/exampleN01/utilities.o] Error 1
第251行上的错误是指

char *filename1 = new(char[filenameLength]);
如果您需要任何其他信息,请告诉我。

试试这个

    char *filename1 = new char[filenameLength];
不能像这样在堆栈上创建一个作为局部可变长度数组的数组

    char filename1[filenamelength];
除非
filenamelength
声明为
const

另外,在为数组分配内存时,应该使用

   delete [] filename1;
否则,您将出现内存泄漏。另外,在
返回值周围加括号也不是必需的

错误是正确的。可变大小数组在C++中是被禁止的。这是一个VLA:

char filename1char[filenameLength];
你的意思可能是:

char *filename1 = new char[filenameLength];
它不是VLA,而是堆上分配的
char
s数组。请注意,应使用运算符
delete[]
删除此指针:

delete[] filename1;

它们是禁止的,但解决方法是使用堆栈分配器,例如:


您可以将堆栈分配器与
::std::vector
(或与其他容器一起使用,或直接使用)一起使用,您已经得到了一个
VLA

您是否传递了将警告视为错误的
-Werror
?G++允许VLAs作为扩展,这是C,而不是C++。你只是使用C++编译器。C什么时候介绍“新”和“删除”关键字?我应该用DELL[]文件FIENMEAM1?@ USE159364,<代码>删除>代码>来替换你的代码>新的< /代码>,>代码>删除[]/Cord>什么>代码>新[] < /代码>。