2011-01-13 55 views
3

因此,我正在研究固件的「快速和髒」分析器 - 我只需要知道某些函數需要多長時間。僅僅打印每次所花費的時間會使結果偏離,因爲日誌記錄很昂貴 - 所以我將一堆結果保存到一個數組並在一段時間後拋棄。直接從其他人訪問一個編譯單元的靜態變量C

當在一個編譯單元(一個源文件)中工作時,我只是有一堆存儲結果的靜態數組。現在我需要在多個文件中執行此操作。我可以「複製粘貼」代碼,但那隻會是醜陋的(與我一起)。如果我把時間代碼放在一個單獨的編譯單元中,創建靜態變量,並在頭文件中提供存取函數,那麼每次我想訪問這些靜態變量時,我都會招致函數調用的開銷。

是否可以直接訪問編譯單元的靜態變量?

我一直試圖封裝數據,而不是使用全局變量,但這種情況只是由於速度問題。

我希望這是有道理的!謝謝!

編輯:好了,所以纔出現,我問什麼是impossible-做任何你看到的替代品,基本上讓我直接訪問另一個編譯單元的數據?

編輯2:謝謝你的答案巴勃羅和喬納森。我最終接受了Pablo's,因爲我沒有明確的地方讓我得到指向靜態數據的指針(根據Jonathan)在我的情況中。再次感謝!

+0

回覆:*我一直試圖封裝數據,而不是使用全局變量*編程沒有絕對的規則。爲了這個特殊的目的,我想說根據PABlo的答案,可以有一個全局變量。 – JeremyP 2011-01-13 16:51:40

回答

7

不,不可能從另一個編譯單元訪問static變量。 static關鍵字精確地防止了這種情況的發生。

如果你需要從另一個訪問一個編譯單元的全局變量,你可以這樣做:

file1.c中:

int var_from_file1 = 10; 

file2.c中:

extern int var_from_file1; 
// you can access var_from_file1 here 

如果可以的話從你的聲明中刪除static關鍵字,你應該沒問題。我知道改變現有的源代碼並不總是一種選擇(I.E.處理現有的遺留編譯代碼)。

3

要從另一個單元C2獲取編譯單元C1中的靜態變量,C1中的某些函數必須指向C2可用的變量的指針,或者某些非靜態變量必須包含指向靜態變量的指針。所以,你可以將'靜態變量'打包到一個單一的結構中,然後編寫一個函數返回一個指向該結構的指針;你可以調用該函數來訪問靜態變量。

類似的規則適用於靜態函數;如果文件中的某個函數(或非靜態變量)使指向這些函數的指針可用,則可以從文件外部間接調用靜態函數。

如果通過指針訪問不直接計算,那麼你被窺探; static隱藏並且您無法取消隱藏,除非在模塊編譯時從變量中刪除關鍵字static - 也許可以通過C預處理器。小心名稱衝突。