2016-06-12 6 views
-2

У меня есть два файла: uart.c, он имеет буксирные переменные в строках 4-5-го:Могу ли я получить доступ к статической переменной файла из другого файла с помощью указателя?

static FIFO inputBuffer; 
static FIFO outputBuffer; 

И buffer.c, которая имеет sevenal функции управления FIFO структурами, как:

void FIFOGet(FIFO* buffer, uint8_t* data, uint8_t length) 

Эти функции для общего использования, так что я никогда не буду иметь дело с inputBuffer в buffer.c напрямую, только с помощью указателя. Ablove функция вызывается из uart.c как:

FIFOGet(&inputBuffer, someArray, n) 

Но внутри этой функции я потерял «значение s (я знаю, что inputBuffer расположен на 0x04f0, когда я вызываю функцию, но buffer» buffer значение s является 0x04ea - который указывает на outputBuffer, я на 140% уверен, что вызов функции прекрасен, я не прохожу outputBuffer). Это происходит потому, что я объявил inputBuffer как static? Если это так, я удалю его, но должен ли я поставить extern FIFO inputBuffer в buffer.c? Я бы хотел, чтобы кто-нибудь мог объяснить, как это работает.

+0

прочитал о 'static' переменных ... –

ответ

0

В C по умолчанию в объектном файле «публикуются» любые символы, находящиеся в области файлов («глобальные» переменные и функции). Это часто полезно, но также предотвращает публикацию этих точных символов другими модулями.

Таким образом, чтобы быть хорошим модулем, если символ области видимости не будет доступен за пределами файла, вы должны объявить его как static. Это означает, что символ не будет опубликован в объектном файле - вот и все. Вы все равно можете передавать указатели на этот символ другим модулям: они просто не могут получить к нему доступ по имени.

Если вы положили extern FIFO inputBuffer; в buffer.c, вы получили бы ошибку компоновщика. Он рассмотрит все модули для опубликованного символа inputBuffer - и не найдет его.

+0

Для extern-вещи я имею в виду, что после удаления' static'in 'uart.c' я помещаю' extern' в 'buffer.c', так что переменная была бы «истинной глобальной», что для меня не проблема. Но я получаю доступ к этому только по указателю, и я не уверен, что в этом случае «extern» имеет какие-либо последствия. – klenium

+0

Если вы удалите 'static', но * do not * put' extern' в 'buffer.c', то вы получите ошибку компилятора:' Неизвестный символ inputBuffer'. Но я не понимаю: вы говорите, что 'FIFOGet()' имеет правильное значение для 'buffer' в начале, но получает _lost_? Неужели это проблема? Вы не должны пытаться повторно назначить 'inputBuffer'' buffer' - вы должны узнать, как «буфер» потерял значение в первую очередь! –