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. static
iş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, static
yalnı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.
deprecated
açı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 static
anahtar 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 static
modüle static
değil , çünkü aslında modüle değil, kaynak dosyaya (çeviri birimi) başvuruyor . Bu static
modü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 namespace
da 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 namespace
ise private
ait 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
.