2013-09-03 3 views
1

В области файлов я могу использовать объявление вперед в инициализированной (статической) переменной. Существует циклическая зависимость. 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. 

Цель состоит в том, чтобы определить, огромный набор функций, которые имеют такие таблицы. Я не хочу определять второй огромный набор переменных в области файлов. Есть ли способ определить такие переменные в области функций?

EDIT: В код не включена одна важная вещь. Я пропустил static перед инициализированной структурой. Это важно, так как массив не должен строиться на каждом вызове.

+0

Как вы сами исправите сферу действия? Будет ли следующая декларация перезаписывать предыдущую? – auselen

+2

Зачем вам нужно повторно объявить 'count'? – alk

+2

На обсуждении уровня метаданных см. Проблему XY: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – auselen

ответ

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 к нему.

+0

Я понял, что вопрос был неполным. Извините за неудобства. – harper

Смежные вопросы