2010-11-05 12 views
7
void foo() { 
    static int x; 
} 

void bar() { 
    static int x; 
} 

int main() { 
    foo(); 
    bar(); 
} 
+3

Bu kod verildi? Hiçbir şey değil. –

+0

Aynı değişkeni bildirmiyorlar. İki farklı işlev asla aynı statik yerel değişkeni bildiremez. –

cevap

20

Her biri yalnızca bir tanesini görür. Bir değişken bu ilan ediyor scope dışından "görüldü" olamaz

, diğer taraftan, bu yaptıysak:.

sonra
static int x; 

void foo() { 
    static int x; 
} 

int main() { 
    foo(); 
} 

foo() sadece görür onun yerel x; Küresel x, onun tarafından "gizlendi". Ancak, diğerine yapılan değişiklikler diğerinin değerini etkilemez.

+0

@FredOverflow: Bunu yakaladığınız için teşekkürler ... –

+0

, C++ 'daki statik globals'tan daha iyi stil kabul edilen anonim ad alanlarıdır? "Statik int x;" nin iki kullanımı (bir küresel, bir yerel) sorunu zorlaştırıyor gibi görünüyor. – Flexo

+3

@awoodlannd: Bu amaçla 'statik' kullanımı C++ (D.2/1) 'den kaldırılmıştır. İster daha iyi bir tarz olsun, sorduğunuz kişinin bu kullanımdan muaf tutularak kabul edilip edilmediğine bağlı olarak ... –

3

Bu kesinlikle gayet güzel. Pratikte, derleyicinin çıktısındaki değişkenin gerçek adı, function_bar_x gibi bir şey olarak düşünülebilir, yani bunların çatışmaması için derleyicinizin sorumluluğundadır.

6

Değişkenler farklıdır, her işlevin kendi kapsamı vardır. Dolayısıyla, her iki değişken de sürecin ömrü boyunca sürse de, birbirleriyle etkileşime girmezler.

1

İki statik vars farklıdır.

2

Hiçbir şey hem değişkenler katılmalarının kapsama sahip ve çağrı

0

compilator benzersiz bir şekilde her değişkeni çevirir daki örnekte gibi foo_x ve bar_x aramaya değerlerini mantain, bu yüzden farklı tehdit edildiği gibi olur.

Bunu yapmak için kodunuzu bir kereden sonra okumak ve sürdürmek zor olacak çünkü bir kerede x'a atıfta bulunulamayacaksınız.