2012-07-07 88 views
12

我正在使用其他人编写的一些现有代码,我无法编译它(这里的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]); 

如果您需要任何额外的信息,让我知道吧。

+0

你是否在传递'-Werror',将警告视为错误? g ++允许VLA作为扩展。 – 2012-07-07 23:22:05

+5

真的,这是C,而不是C++。你只是使用C++编译器。 – 2012-07-07 23:22:45

+3

C何时引入“新”和“删除”关键字? – DavidO 2012-07-08 00:27:55

回答

11

试试这个

char *filename1 = new char[filenameLength]; 

你不能这样

char filename1[filenamelength]; 

除非filenamelength被声明为const创建数组作为栈上的局部变量的长度数组。

而且,你已经为数组分配的内存,您应该释放使用

delete [] filename1; 

否则就会有内存泄漏的内存。此外,在您的return值附近加上括号并不重要;

+0

我认为这对我有效。谢谢 – user1509364 2012-07-07 23:25:53

20

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

char filename1char[filenameLength]; 

你什么意思大概是这样的:

char *filename1 = new char[filenameLength]; 

这不是VLA,但char秒的阵列在堆上分配。请注意,您应该使用运营商delete[]删除此指针:

delete[] filename1; 
+1

我应该用delete [] filename1替换delete(filename1)? – user1509364 2012-07-07 23:32:53

+2

@ user1509364,'删除'你'新'','删除[]'你'新'[]''。 – chris 2012-07-07 23:34:22

+0

@ user1509364是的,正好。 – mfontanini 2012-07-07 23:41:07