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. static
fungsi sesuai standar tidak lagi ditinggalkan!
Meskipun demikian, ruang nama yang tidak bernama lebih unggul dari kata kunci statis, terutama karena kata kunci static
hanya 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-namespace
lebih unggul static
.
Juga, perhatikan bahwa penggunaan kata kunci statis tidak digunakan lagi ketika mendeklarasikan objek dalam lingkup namespace (sesuai Standar).
deprecated
komentar ini telah dihapus dari C ++ 0x FCD terbaru (n3225).
.cpp
mendefinisikan kelas dengan nama yang sama.
Ada masalah menarik terkait hal ini:
Misalkan Anda menggunakan static
kata kunci atau tidak bernama namespace
untuk 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 namespace
s 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 static
modul, karena static
sebenarnya tidak merujuk ke modul , tetapi ke file sumber (unit terjemahan). Anda dipaksa untuk membuatnya agar tidak static
dapat 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 namespace
juga 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 namespace
adalah 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.
static
berfungsi.