在功能范围内使用时,“没有链接的符号重新声明”

时间:2013-09-03 09:19:12

标签: c gcc

在文件范围内,我可以在初始化(静态)变量中使用前向声明。存在循环依赖。 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。这是必不可少的,因为不应该在每次调用时构建数组。

1 个答案:

答案 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的死存储。