【发布时间】:2012-04-25 03:26:39
【问题描述】:
我看过这些,但他们没有回答我的问题:
variable-sized object may not be initialized
C compile error: "Variable-sized object may not be initialized"
Error: Variable-sized object may not be initialized. But why?
我正在尝试编写一些相当便携的 c 代码:
int main ()
{
const int foo=13;
int bar[foo]={0};
return 0;
}
使用以下任一方法编译为c 代码时出现variable-sized object may not be initialized 错误:
- gcc 4.3.4
- arm-linux-gnueabi-gcc 4.4.5
如果我在 VS2008 中将其编译为 c,我会得到一个略有不同的 error C2057: expected constant expression
我了解到,c 代码编译器无法将 const int foo=13; 识别为真正的常量;例如我们可能有
void a(int fool)
{
const int foo=fool;
int bar[foo]={0};
}
我也意识到unlike the gcc compilers,VS2008编译器没有C99 variable-length arrays的概念。而且那个 MS 显然没有提到任何未来的支持。
然而,cpp 代码编译与 gcc 或 MS 编译器完全不同/更聪明?!
关于 gcc c 代码编译器我不明白的地方是:
(注意:在最后一种情况下,MS c 代码编译失败;与 int bar[foo]={0}; 一致)
【问题讨论】:
-
在我的 TDM-GCC 4.6.1 上,最后一个示例 not 编译(同样是“可变大小的对象可能未初始化”)。我也从未听说过由初始化列表初始化的 VLA,这甚至是正确的 C 吗?调查它..
-
对于您关于 MS 编译器的部分问题,这不是唯一缺少的功能,它们根本不支持 C99。从去年开始,甚至还有一个更新版本的标准 C11,所以他们现在缺少 2 个主要版本。
-
@anthales,谢谢。嗯..
-
..关于 VLA 初始化问题,我同意你的看法——这就是我在
cpp编译测试中投入的原因。 -
通过查看 C++ 编译器的功能来尝试理解 C 问题绝不是一个好主意——据我所知,C++ 甚至没有 VLA,但这只是来自的 GNU 扩展海湾合作委员会。如果您真的需要知道您是否正在编写合法的 C 代码,请选择您的 C 标准 here。现在已经接受 Mats 的回答了 ;)