2010-05-26 5 views
4

Я хотел знать, есть ли какие-либо побочные эффекты при любых обстоятельствах.Можно ли вернуть ссылку на переменную static?

Для экс:

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

+0

Я бы сказал, что они оба имеют статическую продолжительность хранения, что не означает, что они оба являются глобальными переменными. Глобалы объявляются вне функций. – Artur

2

По существу нет разницы, кроме сферы.

Следовательно, локальная переменная предпочтительнее, если этот указатель будет единственным способом доступа к переменной.

+1

Обратите внимание, что статические переменные на уровне функции имеют тенденцию делать ваш код не реентерабельным, если вы полагаетесь (или, особенно, если вы меняете) значение вне функции. Не делайте этого, если вы цените свое здравомыслие. – cHao

+0

@cHao: В этом отношении они не отличаются от статических переменных глобального масштаба. – caf

+0

@caf: Правильно ... глобалы любого типа, скорее всего, вызовут проблемы с повторной установкой. Статичность на уровне функций особенно коварна, хотя отчасти потому, что на первый взгляд они не выглядят так, как глобалы, хотя во всех смыслах это действительно имеет значение. – cHao

Смежные вопросы