2016-06-12 20 views
-2

我有兩個文件:uart.c,它在4-5th線拖變量:我可以通過指針從另一個文件訪問文件的靜態變量嗎?

static FIFO inputBuffer; 
static FIFO outputBuffer; 

而且buffer.c,其中有sevenal功能來管理FIFO結構,如:

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

這些功能是一般用途,所以我絕不會直接在buffer.c處理inputBuffer,只能通過指針。該ablove功能從uart.c爲所謂:

FIFOGet(&inputBuffer, someArray, n) 

但這個函數中我失去了buffer的價值(我知道inputBuffer位於0x04f0當我打電話的功能,但buffer的價值是0x04ea - 這指向outputBuffer,我140%肯定函數調用沒問題,我沒有通過outputBuffer)。這是因爲我宣稱inputBufferstatic?如果是這樣,我會刪除它,但我應該extern FIFO inputBufferbuffer.c?我想如果有人能解釋它是如何工作的。

+0

閱讀關於'static'變量... –

回答

0

在C中,默認情況下,文件範圍內的任何符號(「全局」變量和函數)都會在對象文件中「發佈」。這通常很有用 - 但它也會阻止其他模塊發佈精確的符號。

所以要成爲一個很好的模塊,如果文件範圍符號不會被訪問到文件外部,你應該聲明它爲static。這意味着該符號不會在對象文件中發佈 - 就是這樣。您仍然可以將指向該符號的指針傳遞給其他模塊:它們無法通過名稱訪問它。

如果你確實把extern FIFO inputBuffer;置入buffer.c,你會得到一個鏈接錯誤。它會查看所有模塊的已發佈符號inputBuffer - 但沒有找到。

+0

對於extern-thing,我的意思是在我將'static'in'uart.c'移除後,將'extern'放入'buffer.c'中,這樣變量將是一個「真正的全球」,這對我來說不是問題。但是我只能通過指針訪問這個虛擬對象,我不確定在這種情況下'extern'會有什麼影響。 – klenium

+0

如果你刪除'static',但是*不把'extern'放在'buffer.c'中,那麼你會得到一個編譯器錯誤:'Unknown symbol inputBuffer'。但我不明白:你說'FIFOGet()'在開始時有'buffer'的正確值,但它會得到_lost_?這當然是問題嗎?你不應該試圖重新分配'inputBuffer'到'buffer' - 你應該首先找出'buffer'是如何失去了價值的! –

相關問題