Const neden C ++ 'da iç bağlantıyı ima ederken, C' de yok?


83

Konuya bakın. Ne düşünüyorlardı?

GÜNCELLEME: Karışıklığı önlemek için "statik" den "dahili bağlantı" ya değiştirildi.

Bir örnek vermek gerekirse ... Aşağıdakileri bir dosyaya koymak:

const int var_a = 1;
int var_b = 1;

... ve g++ -c test.cppyalnızca dışa aktarımla derleme var_b.

Yanıtlar:


113

Demek istediğine inanıyorum

Const neden C ++ 'da dahili bağlantıyı ima ediyor?

Bir isim alanı kapsamında bir const nesnesi bildirirseniz, o zaman iç bağlantıya sahip olduğu doğrudur.

Ek C ( C ++ 11, C.1.2 ) mantığını verir

Değişiklik: Açıkça const olarak bildirilmiş ve açıkça extern olarak bildirilmemiş bir dosya kapsamı adı iç bağlantıya sahipken, C'de harici bağlantıya sahip olacaktır.

Gerekçe: const nesneleri C ++ 'da derleme zamanı değerleri olarak kullanılabildiğinden, bu özellik programcıları her sabit için açık başlatıcı değerleri sağlamaya teşvik eder. Bu özellik, kullanıcının birçok derleme biriminde bulunan başlık dosyalarına const nesneleri koymasına olanak tanır.


Görünüşe göre const olmayan küresel nesneler de başlatılabilir, ancak standart neden iç bağlantı vermiyor?
Yong Li

13

Litb'in dediği gibi, constnesnelerin C ++ 'da dahili bağlantıları vardır. Bunun nedeni, şu şekilde kullanılmalarıdır:

// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];

6

Sabit ve statik, hem C hem de C ++ 'da ortogonal kavramlardır.

constAnahtar kelime herhangi ifadenin lvalue olarak görünmemesi değişkeni izin vermemek için derleyici söyler - aslında bu salt okunur hale.

C'de, staticanahtar kelimenin neye uygulandığına bağlı olarak birkaç kullanımı vardır. Bir işlevin değişkenine uygulandığında, değişkenin bir işlevin yerel kapsamında depolanmadığını, ancak işlevin çağrıları üzerinden erişilebilir olduğunu gösterir. Global bir değişkene veya işleve uygulandığında, yalnızca belirli bir dosya için erişilebilir hale gelir - başka bir deyişle, yalnızca derleme birimi içinde erişilebilir (bildirilmediği sürece extern).

C ++ 'da, staticanahtar kelime, her bir örneğe yerel olmak yerine sınıfın tüm örneklerinde paylaşılan bir değişken veya işlevler oluşturmak için bir sınıf tanımı içinde kullanılabilir . Ayrıca, C ++ 'daki bir statik sınıf işlevi, yalnızca o sınıfın (veya erişimi olduğu sınıfların) statik değişkenlerine erişebilir. Şimdi, C ++ ' constda, açıkça bildirilmedikçe üyelere derleme birimine dahili bağlantı sağlar extern- bu, sizin bahsettiğiniz şey olabilir. Bu, derleme zamanı sabitlerinin başlık dosyalarının kullanımıyla birim boyunca paylaşılmasına izin verir. Yine de, üyelerin gerçekten statik olmadığını unutmayın - daha ziyade sabit , başvurulduğu her konuma derlenir .


6

C & C ++ 'da statik terimi birden fazla anlama sahiptir (bağlantı ve depolamayı yönetebilir) Mantığını anlamak için Stroustrup'un D & E'sini okumalısınız - ancak ad alanı kapsamında sabit olacak bir değişken tanımladığınızda otomatik olarak dahili bağlantıya sahip olur - oysa C'de, onu iç bağlantıya sahip olmaya zorlamak için statik olarak bildirmeniz gerekir.

Elbette C ++ 'da, bağlantıyı kontrol etmek için statik kullanımı kullanımdan kaldırılmıştır, anonim ad alanları C ++' da dahili bağlantıyı simüle etmek için kullanılabilir.

C ++ 'daki const değişkenlerinin önişlemci sabitlerinin yerini alması gerekiyordu - ve önişlemci sabitleri yalnızca onları tanımlayan dosyalarda göründüğünden, benzer şekilde const değişkeni yalnızca onu tanımlayan dosyada görünür kılar.


4

Bu kavramlar ortogonaldir ve aynı şey olarak düşünülmemelidir.

Sabitlik bir erişim özelliğidir: yalnızca değişkeninizin salt okunur (sabit) veya yazma-okuma (sabit olmayan) olması gerektiğini söyler.

Statiklik, bir yaşam süresi (ve teknik olarak bellek yerelleştirme) özelliğidir: değişkenin bir sınıf kapsamında mı (bir sınıf içindeyken) veya bir çeviri birimi (bir cpp'de tanımlanmış bir global değişkenle kullanıldığında) kapsamında global olup olmayacağını söyler .


-2

Öyle değildir ve en bariz örnek, bir const üye değişkeniniz varsa (tabii ki kurucu tarafından başlatılır), bu sınıfın tüm nesneleri tarafından değil, her biri için ayrı ayrı paylaşılır.

class A {
public:
  A(int newx) : x(newx);
private
  int x;
}

litb yukarıda en iyi cevabı verir.


Her zaman değil mi? (litb)
RastaJedi

-5

Öyle değil. Aşağıdakileri yazmak:

const int i = 0;

istatik yapmaz (C veya C ++ 'da).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.