statik globaller ve C ++ 'da anonim ad alanları


11
  1. C ++, neden adlandırılmamış bir ad alanındaki statik globaller (iç bağlantı) ve semboller arasında (dış bağlantı, ancak yine de dışarıdan referans vermenin bir yolu yok), ikincisini tanıtırken neden bir ayrım yaptı?

  2. Bu nedenlerden herhangi biri hala geçerli mi, yoksa yeni nedenler var mı?

  3. Hala farklı oldukları, anonim küresel (veya isim-alanı-kapsamı) sendikaların olması gerekenstatic keyfi kural kalan yerler var mı ve bunlar nedir?

  4. Bonus puanlar için, farklı olmaları için iyi bir neden kalmadıysa, eşdeğer olmaları için bir talep var mı?


C ++, ad alanlarını (C ++ 98) ve özellikle adsız ad alanlarını tanıttığında, statik globaller, C ++ 11 : Statik anahtar kelimenin kullanımdan kaldırılmasıyla birlikte, eski bir coşkudaki yeni şeyden daha eski ve aşağı olarak reddedildi
… daha fazla yok?

C ++ 11'den önce, iç bağlantıya sahip simgeler şablon bağımsız değişkenleri olarak kullanılamaz: C ++ 03 neden şablon parametrelerinin dış bağlantıya sahip olmasını gerektiriyordu?


"Uygun uygulama" biti dışında çoğunlukla kendi sorunuzu yanıtlamışsınız gibi görünüyor; belki ikinci yarıyı kaldırmayı ve cevap olarak göndermeyi düşünmelisiniz? Yoksa burada hala cevaplanmamış bir şey var mı?
Kyle Strand

@KyleStrand Her şeyi yeniden biçimlendirdi.
Deduplicator

Yanıtlar:


3

Bu tüm sorularınızı (veya herhangi birini?) Cevapları varsayalım, ancak dosya düzeyinde statik bildirimler ve anonim ad alanları arasındaki temel fark, ad alanlarının türler için de geçerli olmasıdır (bir statictür bildiremezsiniz ). aynı duyguyu değişken olarak bildirirsiniz), bu nedenle ad alanı tercih edilir, bu nedenle dosya kapsamındaki verileri ve türleri bildirmek için tek bir deyim vardır.

Örnek olarak, aşağıdaki kod gayet iyi derlenmelidir. (Gerçekten yararlı değil, çünkü her iki türü de ayırt edemezsiniz, ancak izin verilir)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

Burada canlı bir test .


Derler çünkü ana işlevde Foobar kullanmazsınız.
dshil

Daha da önemlisi, başka bir .cpp dosyası kendi sürümünü bildirirse ne olur struct Foobar? Daha da kötüsü, şimdi varsayalım class Foobar. Her ikisi için nasıl yapıcı oluşturmayı planladığınızı düşünün.
dgnuff
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.