C++ 禁止可变大小数组

标签 c++

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

utilities.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]);

如果您需要任何其他信息,请告诉我。

最佳答案

错误是正确的。 C++ 中禁止使用 VLA(可变大小数组)。这是一个 VLA:

char filename1char[filenameLength];

你的意思可能是这样的:

char *filename1 = new char[filenameLength];

这不是 VLA,而是分配在堆上的 char 数组。请注意,您应该使用运算符 delete[] 删除此指针:

delete[] filename1;

关于C++ 禁止可变大小数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379433/

相关文章:

c++ - 尝试减小输出大小后,Visual Studio 编译程序无法正确初始化

c++ - 我的 OpenGL 应用程序适用于 ATI,但不适用于 nNVIDIA pc

c++ - 使用 std::vector,为什么 &vec[0] 是未定义的行为,但 vec.data() 是安全的?

c++ - 我如何找到标签等于字符串变量的 TreeView 节点?

c++ - RWTime 显示本地时间+1

c++ - 什么 3d 引擎可以用于 3d 编辑器应用程序?

c++ - 可选错误处理

c++ - 运行固定数量的线程

c++ - 相机到物体的距离.. 纠错

c++ - 在 C++11 中,有没有一种方法在调用将任何可调用对象(包括绑定(bind)方法)作为参数的函数时不需要模板参数?