2010-11-05 11 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.

İlgili konular