gcc 4.4.2 c89在函數中聲明靜態變量
我一直在重新設計一些其他人的源代碼。
在某個函數中,某人已經聲明瞭一些靜態變量,但似乎沒有達到使它們靜態的任何目的。我只是想知道下面的評論是否準確?
static char tempstr[64];
爲了我的理解,當在一個函數內部聲明靜態變量時,它將保留作用域,所以像全局變量一樣行爲。
此外,如果靜態變量在全局範圍內聲明,則其範圍僅限於文件。
非常感謝您的任何建議,
gcc 4.4.2 c89在函數中聲明靜態變量
我一直在重新設計一些其他人的源代碼。
在某個函數中,某人已經聲明瞭一些靜態變量,但似乎沒有達到使它們靜態的任何目的。我只是想知道下面的評論是否準確?
static char tempstr[64];
爲了我的理解,當在一個函數內部聲明靜態變量時,它將保留作用域,所以像全局變量一樣行爲。
此外,如果靜態變量在全局範圍內聲明,則其範圍僅限於文件。
非常感謝您的任何建議,
如果我理解你的解釋,它是準確的。
函數內部靜態意味着「分配數據段內存,因此該值在函數調用之間保持不變,因此所有函數實例(思考,遞歸或線程)共享相同的實際存儲。
如果在以後的函數調用中使用先前的值,或者通過外部調用或通過返回指針將引用從函數中泄漏出來,則這很重要。
是的,你的解釋是正確的。除了要小心所謂的「像全球一樣行事」。它只是在全局範圍內起作用,因爲它在調用之間保留了值,但它不是全局可見的,而只是在聲明它的函數中。
另請參閱this question。
從一開始它就像一個「初始化」一樣,它也「像全球化」一樣。 – jamesdlin 2010-02-16 07:20:29
它並不是全球性的。它仍然是一個本地變量,它只是在連續調用時保持其價值。
這是正確的。還有一個方面要記住,如果你的代碼是多線程的,所有的線程將共享同一個變量副本,所以原始設計者使用該變量作爲跨線程通信機制在技術上是可行的。我不主張這種技術,但我不能在沒有更多信息的情況下排除它。
該應用程序不是多線程的。但是你所說的是,當一個不同的線程調用該函數時,所有線程都將保留該值。因此,如果一個線程更改了值,則另一個線程訪問該函數將看到另一個線程修改的值。如果你不希望發生這種情況,這可能是一件壞事。但是,對於交叉通信,您可能希望線程讀取已從另一個線程設置的值,也許可以使用修改後的值作爲其他值。我在發言中是否正確? – ant2009 2010-02-16 04:53:26
是的,這是正確的。我與靜態局部變量的問題是,他們是「狀態」。保持一致的程序狀態可能是編程中最難的事情,並且當你在各地散落着小塊的狀態時,它會使編寫正確的程序變得非常困難。我更喜歡對問題域進行建模,並創建一個非程序員領域專家認爲是他/她試圖解決的問題的類的層次結構。由靜態局部變量表示的狀態難以定位,維護和理解。 – 2010-02-16 16:13:06
我敢打賭,函數返回tempstr。這是一種常見的絕望行爲。靜態關鍵字是非常需要的。 – 2010-02-16 04:50:33
它並不總是絕望,如果你知道一個字符串將會是xx字節長,返回它的函數會受到某種形式的互斥的保護,並且調用者不需要修改返回的內容......你可以節省tickling malloc ()在循環中成千上萬次(特別是當mlockall()被使用時)。但是,是的,計算優化與僅僅丟失指針的人有區別。 – 2010-02-16 09:25:50