2010-05-26 46 views
4

我想知道在任何情況下是否有任何不良影響。可以返回函數作用域靜態變量的引用嗎?

對於前:

Ex1: 
void* func1() 
{ 
    void* p_ref = NULL; 
    //function scope static variable 
    static int var1 = 2; 
    p_ref = &var1; 
    return p_ref; 
} 
Ex2: 

//file scope static variable 
static int var2 = 2; 

void* func2() 
{ 
    void* p_ref = NULL; 
    var2 = 3; 
    p_ref = &var2; 
    return p_ref; 
} 

因此,在上述兩種情況有什麼區別除了一個事實,即VAR1是功能範圍和VAR2是文件範圍。

在此先感謝。

回答

2

我不相信有任何區別。它們都是全局變量,只是第一個名字只在函數func1的範圍內可見。

+2

你的兩個函數之間的一個區別是func2會在每次調用時將全局變量var2的值設置爲3。而func1不會改變var1的值。 – eemz 2010-05-26 10:34:04

+0

我會說他們都有靜態存儲時間,這並不意味着他們都是全局變量。全局被聲明爲外部函數。 – Artur 2012-01-29 10:20:08

2

除了範圍之外基本上沒有區別。

因此,如果該指針 將是訪問該變量的唯一方式,則局部變量更可取。

+1

但請注意,如果您依賴(或特別是如果您更改)函數外的值,函數級別的靜態變量往往會使您的代碼不可重入。如果你重視你的理智,不要這樣做。 – cHao 2010-05-26 10:17:56

+0

@cHao:在這方面,它們與全局範圍的靜態變量沒有區別。 – caf 2010-05-26 13:35:20

+0

@caf:對......任何類型的全局變量都可能導致重入問題。但功能級靜態特別隱蔽,部分是因爲乍一看,它們看起來不像全局變量 - 儘管在任何真正重要的意義上它們都是。 – cHao 2010-05-26 21:49:06

相關問題