在文件范围内,我可以在初始化(静态)变量中使用前向声明。存在循环依赖。 s[0]
是指count
的地址。 count
是指s
中的项目数。
struct s { int *a; };
static int count;
int data1;
static struct s s[] = {
&count, &data1 // , ... a lot more
};
static int count = sizeof(s) / sizeof(s[0]);
如this StackOverflow question所示,不可能在函数(或块)范围内使用相同的构造。
void foo(void)
{
static int count;
static struct s s[] = {
&count, &data1 // , ... a lot more
};
static int count = sizeof(s) / sizeof(s[0]);
}
导致错误消息
redeclaration of 'count' with no linkage.
目标是定义一组包含此类表的大量函数。我不愿意在文件范围内定义第二组巨大的变量。有没有办法在函数范围定义这样的变量?
编辑:代码中没有包含一件重要的事情。我在初始化结构之前错过了static
。这是必不可少的,因为不应该在每次调用时构建数组。
答案 0 :(得分:2)
您可能根本无法重新定义它,而是将值赋给它:
void foo(void)
{
static int count;
struct s s[] = {
&count, &data1 // , ... a lot more
};
count = sizeof(s) / sizeof(s[0]);
}
差异应该可以忽略不计。可替换地:
void foo(void)
{
struct s s[] = {
NULL, &data1 // , ... a lot more
};
static int count = sizeof(s) / sizeof(s[0]);
s[0].a = &count;
}
编译器甚至可以优化它以将s[0].a
成员初始化为&count
并消除NULL
的死存储。