我在以下程序的第6行(初始化my_foo到foo_init)时收到错误,我不确定我理解为什么.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这是我正在研究的大型多文件项目的简化版本.目标是在目标文件中有一个常量,多个文件可用于初始化状态结构.由于它是一个资源有限的嵌入式目标,并且结构不是那么小,我不想要源的多个副本.我不想使用:
#define foo_init { 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)
我也在尝试编写可移植代码,所以我需要一个有效的C89或C99解决方案.
这是否与目标文件中的ORG有关?初始化变量进入一个ORG并通过复制第二个ORG的内容进行初始化?
也许我只需要改变我的策略,并在启动时使用初始化功能完成所有副本.除非有其他想法吗?
我有一些像这样的代码:
static int a = 6;
static int b = 3;
static int Hello[a][b] =
{
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3}
};
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,它说错误:
在文件范围内可变地修改了"Hello"
怎么会发生这种情况?我该怎么办呢?
在以下代码中,const int不能用作数组大小:
const int sz = 0;
typedef struct
{
char s[sz];
} st;
int main()
{
st obj;
strcpy(obj.s, "hello world");
printf("%s", obj.s);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 所以我希望在编译时知道结构中数组大小的定义.我也希望这个号码可以作为变量使用,以方便以后使用.我所拥有的是以下内容:
const int BANANA_ARRAY_SIZE = 10;
typedef struct
{
char bananas[BANANA_ARRAY_SIZE];
int some_other_stuff;
} banana_struct;
Run Code Online (Sandbox Code Playgroud)
这个功能很好.但是,如果我将它放在一个包含在多个位置的.h文件中,编译器会抱怨重新定义BANANA_ARRAY_SIZE(这是有道理的).所以我需要将它声明为extern,因此多个编译单元可以知道它.
所以,我现在有
extern const int BANANA_ARRAY_SIZE;
typedef struct
{
//.. same as before
} banana_struct;
Run Code Online (Sandbox Code Playgroud)
在我的实施文件中
const int BANANA_ARRAY_SIZE = 10;
Run Code Online (Sandbox Code Playgroud)
但是现在编译器不会让我再次定义结构了
fields must have a constant size: variable length array in structure
Run Code Online (Sandbox Code Playgroud)
有什么方法可以实现我想要的(将数组的长度存储在变量中并用于定义struct)?
编辑:
为了回应使用#defines 的建议,我宁愿不这样做.
我的问题是如何将这个常量值存储在变量中,还用于设置结构中数组的长度.如果你需要进一步的理由,假设我需要一个带有指向int的指针的函数.不能参考#define.