Jawaban:
Anda pada dasarnya merujuk pada bagian §7.3.1.1 / 2 dari Standar C ++ 03,
Penggunaan kata kunci statis tidak digunakan lagi ketika mendeklarasikan objek dalam lingkup namespace; namespace tanpa nama memberikan alternatif yang unggul.
Perhatikan bahwa paragraf ini sudah dihapus dalam C ++ 11. staticfungsi sesuai standar tidak lagi ditinggalkan!
Meskipun demikian, ruang nama yang tidak bernama lebih unggul dari kata kunci statis, terutama karena kata kunci statichanya berlaku untuk deklarasi dan fungsi variabel , bukan untuk tipe yang ditentukan pengguna .
Kode berikut ini valid dalam C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Tetapi kode ini TIDAK valid:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Jadi solusinya adalah, namespace tanpa nama, yang ini,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Semoga ini menjelaskan bahwa mengapa unnamed-namespacelebih unggul static.
Juga, perhatikan bahwa penggunaan kata kunci statis tidak digunakan lagi ketika mendeklarasikan objek dalam lingkup namespace (sesuai Standar).
deprecatedkomentar ini telah dihapus dari C ++ 0x FCD terbaru (n3225).
.cppmendefinisikan kelas dengan nama yang sama.
Ada masalah menarik terkait hal ini:
Misalkan Anda menggunakan statickata kunci atau tidak bernama namespaceuntuk membuat beberapa fungsi internal ke modul (unit terjemahan), karena fungsi ini dimaksudkan untuk digunakan secara internal oleh modul dan tidak dapat diakses di luarnya. (Unnamed namespaces memiliki keuntungan membuat data dan mengetik definisi internal juga, selain fungsi).
Seiring waktu, file sumber implementasi modul Anda tumbuh besar, dan Anda ingin membaginya menjadi beberapa file sumber terpisah, yang akan memungkinkan pengorganisasian kode yang lebih baik, menemukan definisi lebih cepat, dan untuk dikompilasi secara independen.
Tetapi sekarang Anda menghadapi masalah: Fungsi-fungsi itu tidak bisa lagi menjadi staticmodul, karena staticsebenarnya tidak merujuk ke modul , tetapi ke file sumber (unit terjemahan). Anda dipaksa untuk membuatnya agar tidak staticdapat diakses dari bagian lain (file objek) dari modul itu. Tetapi ini juga berarti bahwa mereka tidak lagi tersembunyi / pribadi ke modul: memiliki hubungan eksternal, mereka dapat diakses dari modul lain, yang bukan maksud asli Anda.
Tidak bernama namespacejuga tidak akan menyelesaikan masalah ini, karena juga ditentukan untuk file sumber tertentu (unit terjemahan) dan tidak dapat diakses dari luar.
Akan lebih baik jika seseorang dapat menentukan bahwa beberapa namespaceadalah private, yaitu, apa pun yang didefinisikan di dalamnya, dimaksudkan untuk digunakan secara internal oleh modul yang dimilikinya. Tetapi tentu saja C ++ tidak memiliki konsep seperti "modul", hanya "unit terjemahan", yang terikat erat dengan file sumber.
Standar C ++ membaca di bagian 7.3.1.1 Ruang nama yang tidak disebutkan namanya, paragraf 2:
Penggunaan kata kunci statis tidak digunakan lagi saat mendeklarasikan objek dalam lingkup namespace, unnamed-namespace memberikan alternatif yang unggul.
Statis hanya berlaku untuk nama objek, fungsi, dan serikat anonim, bukan untuk mengetik deklarasi.
staticberfungsi.