【发布时间】:2015-02-20 15:37:44
【问题描述】:
我有兴趣在 C 中创建一个结构(在其他 POD 类型中)包含一个数组,然后在堆栈上创建它的全局实例。数组长度在编译时是已知的,但对于结构的每个实例都是不同的。结构的每个实例中的值都不会改变,因此应该设置为 const。
目前我有以下代码:
#ifdef __cplusplus
extern "C" {
#endif
#include "stdio.h"
typedef struct A
{
int x;
int y;
int* z;
} A_t;
const A_t test[2] = { {1,1, (int[3]){1,1,1} },
{2,2, (int[5]){2,2,2,2,2} }
};
int main( void )
{
printf( "test[0]: %d %d (%d, %d, %d)\n",
test[0].x,
test[0].y,
test[0].z[0],
test[0].z[1],
test[0].z[2] );
printf( "test[1]: %d %d (%d, %d, %d, %d, %d)\n",
test[1].x,
test[1].y,
test[1].z[0],
test[1].z[1],
test[1].z[2],
test[1].z[3],
test[1].z[4] );
printf( "\n\n" );
return;
}
#ifdef __cplusplus
}
#endif
这将在堆非常有限的嵌入式系统上运行,所以我想避免 malloc,除非我绝对必须这样做。如果可能的话,我也想坚持使用 C89,因为 VS2008 不支持 C99(我认为)。
这在 GCC(通过 MinGW 的 4.8.1)中运行良好,但在 Visual Studio 2008 中无法编译。有人对我如何让它在两个编译器上工作有任何建议吗?
作为参考,这是来自 VS2008 的错误消息:
c:\temp\test_variable_length_arrays\bob.c(15):错误 C2059:语法 错误:'{'
c:\temp\test_variable_length_arrays\bob.c(15):错误 C2059:语法 错误:'}'
c:\temp\test_variable_length_arrays\bob.c(17):错误 C2059:语法 错误:'}
提前感谢所有 cmets。
【问题讨论】:
-
我不确定我是否理解;你想使用 C89 因为 VS2008 不 支持它?顺便说一句,可变长度数组仅在 C99 中可用 - C89/C90 不支持它们(C++ 也不支持)。
-
这不是 vla。而c89不支持vla。
-
我同意 VLA 不能很好地描述我想做的事情;但是,我不确定正确的术语是什么。我不想在运行时改变数组长度,但我确实需要能够在编译时拥有不同长度的数组,由相同的结构定义描述。
-
GoBusto,感谢您发现错字,我已更正。我的意思是 VS2008 对 C99 的支持很少(如果有的话)。
-
你可以声明你的结构有灵活的数组成员。像这样:
struct s { int n; double d[]; };。使用方法:int m = /* some value */; struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));。详情请参考c11标准6.7.2.1。