Yanıtlar:
Temel olarak C ++ 03 Standardının §7.3.1.1 / 2 bölümüne atıfta bulunuyorsunuz,
Bir ad alanı kapsamındaki nesneler bildirilirken statik anahtar sözcüğün kullanımı kullanımdan kaldırılmıştır; isimsiz-isim-alanı daha üstün bir alternatif sağlar.
Bu paragrafın C ++ 11'de zaten kaldırıldığını unutmayın. staticişlevler standart olarak artık kullanımdan kaldırılmamaktadır!
Bununla birlikte, Adsız ad alanları static anahtar sözcüğünden daha üstündür çünkü anahtar sözcük , kullanıcı tanımlı türler için değil, staticyalnızca değişken bildirimleri ve işlevler için geçerlidir .
Aşağıdaki kod C ++ 'da geçerlidir
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Ancak bu kod geçerli DEĞİLDİR:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Yani çözüm, adlandırılmamış ad alanıdır, bu da
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Umarım neden unnamed-namespaceüstün olduğunu açıklar static.
Ayrıca, nesneleri bir ad alanı kapsamında bildirirken (Standart uyarınca) statik anahtar sözcüğün kullanımının kullanımdan kaldırıldığını unutmayın.
deprecatedaçıklama en son C ++ 0x FCD'den (n3225) kaldırılmış gibi görünüyor .
.cpp, aynı ada sahip bir sınıfı tanımlıyor.
Bununla ilgili ilginç bir sorun var:
Modüle (çeviri birimi) bir işlev yapmak için staticanahtar sözcük veya adsız kullandığınızı varsayalım namespace, çünkü bu işlev modül tarafından dahili olarak kullanılmak içindir ve modülün dışından erişilemez. (Adsızlar namespace, işlevlerin yanı sıra veri ve tür tanımlarını da dahili yapma avantajına sahiptir).
Zamanla modülünüzün uygulamasının kaynak dosyası büyür ve onu birkaç ayrı kaynak dosyaya bölmek istersiniz, bu da kodu daha iyi organize etmeye, tanımları daha hızlı bulmaya ve bağımsız olarak derlenmeye olanak tanır.
Ama şimdi bir sorunla karşı karşıyasınız: Bu işlevler artık staticmodüle staticdeğil , çünkü aslında modüle değil, kaynak dosyaya (çeviri birimi) başvuruyor . Bu staticmodülün diğer bölümlerinden (nesne dosyalarından) erişilmesine izin vermemeye zorlanıyorsunuz . Ancak bu aynı zamanda modüle artık gizli / özel olmadıkları anlamına da gelir: harici bağlantılara sahip olduklarından, asıl amacınız bu olmayan diğer modüllerden erişilebilirler .
Adsız namespaceda bu sorunu çözmez, çünkü belirli bir kaynak dosyası (çeviri birimi) için de tanımlanmıştır ve dışarıdan erişilemez.
Biri bazı belirtmek olursanız harika olur namespaceise privateait olduğu modül tarafından dahili kullanılmak üzere içindir, onun içinde tanımlanan şey olduğunu. Ama elbette C ++ "modüller" gibi bir konsepte sahip değildir, sadece kaynak dosyalara sıkı sıkıya bağlı "çeviri birimleri".
static.