2010-03-19 63 views
0

我正在使用gcc编译器在Linux上的Netbeans上开发一个程序,当在Windows 7上切换到Visual C++时,代码无法编译,因为Visual C++在多行上显示它为expected constant expression。 NetBeans上,我压根儿类似char name[fullName.size()];的东西,而在VISUAL C++,我试过了,除其他事项外,用常量创建数组

const int position = fullName.size(); 
char Name[position]; 

如何创建一个常数使用的阵列?

注:我知道关于this question,但是有没有什么办法可以在不使用向量的情况下使用这个工作,因为那需要重写程序的很多部分?

+1

这里的实际问题是“如何在堆栈上创建一个非预定大小的数组?”答案是,你不能用VC++。 – 2010-03-19 21:41:44

+0

什么是fullname.size()?看起来像一个函数调用,这将是运行时调用,因此不是一个常量表达式。 – 2010-03-19 21:42:13

+0

fullname.size()是字符串的长度。这是一个函数调用 – wrongusername 2010-03-19 21:45:59

回答

1

在VC++中,不能做堆叠阵列尺寸的运行时的声明,但你可以通过_alloca

做堆栈分配这样的:

const int position = fullName.size(); 
char Name[position]; 

变成这样:

const int position = fullName.size(); 
char * Name = (char*)_alloca(position * sizeof(char)); 

这不是完全相同的事情,但它和你将要用VC++获得的一样。

+4

我认为我们应该引导问题走向堆......我不想看到一个初学者开始用_alloca – 2010-03-19 21:49:00

+0

编写代码@George:堆可能是一个更好的选择,但对于一个简单的字符串缓冲区,这是一个更糟糕的选择。 – 2010-03-19 21:57:27

+0

为什么不使用std :: string?他说他是初学者,这是最容易使用的东西。 – 2010-03-19 22:07:41

2

这在VC++中是不可能的。我知道,相当难过:(

的解决方案包括:

  • 堆上
  • 创建它让它不断

新的C++标准(C++ 0x中)提出了一种'constant expression'功能来解决这个问题,更多的信息请查看this out。

+0

谢谢!我不能让它保持不变,因为我不知道字符串的大小。 “在堆上创建它”是什么意思?对不起,我仍然是编程的新手。 – wrongusername 2010-03-19 21:46:47

+0

使用'new'分配内存并用'delete'释放 – 2010-03-19 21:49:21

+1

这意味着使用'vector'。有*没有*理由有原始内存分配悬而未决,他们泄漏,让你的生活更加困难。 – GManNickG 2010-03-19 22:03:27

1

C++要求在编译时知道数组的大小如果你不介意使用g是一个非标准的扩展,gcc确实允许像你这样做的代码(注意虽然它不是标准的C++,但它在C中为标准,从C99开始)。我也猜测你可以使用一个向量(在这个特定的地方),比你想象的更麻烦 - 虽然为数组编写的相当一部分代码只能使用一个向量,编译,很少或根本不重写。

0

你的char name[fullName.size()];是一个variable-length array的例子 - 据我所知 - 在C++中没有标准化,所以你受编译器的支配。 [稍微偏离主题他们是C99标准的一部分]