2011-02-18 43 views
7

Statik değişkenin dosya kapsamı vardır. Bir Üstbilgi Dosyasındaki statik değişken

ben ilan ettiler statik değişken hem de static int Var1 demek

  • file1.h
  • file1.cpp
  • file2.h
  • file2.cpp: İki aşağıdaki dosyaları var ki başlık dosyaları. Hem file1.h hem de file2.h, main.cpp dosyasında bulunur.

    Statik değişkenin dosya kapsamına sahip olacağı için bunu yaptım, böylece birbiriyle çakışmayacak. Fakat derlemeden sonra çakışma olduğunu gördüm.

    Artık statik değişken extern değişken gibi davranıyor. Diğer yandan, .cpp dosyalarındaki statik değişkeni bildirirsem, iyi derler.

    Bu davranışı anlayamıyorum.

    Bu senaryoda kapsam ve bağlantının nasıl çalıştığını herhangi bir kuruluş açıklayabilir.

+0

İlgili, bkz. [Bir başlık dosyasında adlandırılmamış ad alanı tanımlama] (https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL59-CPP.+Do+not+define+an+ adsız + ad boşluğu + içinde + a + üstbilgi + dosya) – jww

cevap

13

Statik değişkenler derleme birimine yereldir. Bir derleme birimi temel olarak, her bir #include yönergesinin yerine eklenen .h dosyasının içeriğine sahip bir .cpp dosyasıdır.

Şimdi, bir derleme biriminde aynı ada sahip iki global değişkene sahip olamazsınız. Durumunuzda olan şu: main.cpp, file1.h ve file.h'u içerir ve iki başlığın her biri kendi Var1'u tanımlar.

Mantıken bunlar iki ayrı değişkense, onlara farklı adlar verin (veya farklı ad alanlarına koyun).

bu aynı değişken ise, ayrı bir başlık dosyasında, var1.h içine hareket olup var1.h içinde #include guard unutma file1.h ve file2.h hem var1.h içerir.

2

static int Var1 statik değişkeni varsayarsak, her iki başlıkta da global kapsamdadır ve hem üstbilgileri main.cpp içinde içerir. Öncelikle, ön işlemciler dahil edilen dosyaların içeriğini main.cpp'a kopyalar. main.cpp'da aynı kapsamda iki kez bildirilen Var1 olduğundan, çoklu bildirim hatası ortaya çıkacaktır. (yani, bir adet 'dan ve diğer işlem birimi

'dan kopyalanır) Her kaynak dosyası tek tek derlenir. Şimdi, kaynak dosyalarında ayrı ayrı bildirdiğinizde, her bir kaynak dosya, aynı ada sahip diğer kaynak dosyada bulunan diğer statik değişkenin varlığından habersizdir. Yani, derleyici bir hata bildirmiyor. Bir değişkenin kaynak dosyalar arasında paylaşılmasını istiyorsanız, onu harici olarak işaretleyebilirsiniz.

8

Statik değişkenler çeviri birimi kapsamını (genellikle .c veya .cpp dosyası) var, ama bir dosyanın bir #include direktif basitçe kopya metni tam ve başka çeviri birimi oluşturmaz.Ön işleme sonra bu:

#include "file1.h" 
#include "file2.h" 

bu işe dönecek:

/* file1.h contents */ 
static int Var1; 

/* file2.h contents */ 
static int Var1; 

hangisi, bildiğiniz gibi, geçersizdir.

+0

Benim incelemesi iki derleme birimi olacaktı.Şüpheyle takas için teşekkürler –

İlgili konular