Catatan: pertanyaan ini tentang name space
, bukan namespace
.
Standar C ++ memiliki beberapa referensi name space
, tetapi saya tidak melihat definisi ini. Standar mengatakan bahwa label dan makro berada dalam ruang nama yang berbeda. Semua referensi lain name space
ada di bagian kompatibilitas C / C ++, seperti ini ( konsep saat ini ):
Ini adalah salah satu dari beberapa ketidakcocokan antara C dan C ++ yang dapat dikaitkan dengan definisi ruang nama C ++ baru di mana nama dapat dideklarasikan sebagai tipe dan sebagai non-tipe dalam lingkup tunggal yang menyebabkan nama non-tipe menyembunyikan ketik nama dan mensyaratkan bahwa kelas kata kunci, struct, union atau enum digunakan untuk merujuk pada nama tipe. Definisi ruang nama baru ini memberikan kemudahan notasi penting bagi pemrogram C ++ dan membantu membuat penggunaan tipe-tipe yang didefinisikan pengguna semirip mungkin dengan penggunaan tipe fundamental.
Apa definisi ruang nama baru ini ? Di mana saya bisa menemukannya di standar? Apa aturannya? Aturan tampaknya lebih rumit, daripada "tipe non-tipe hide". Seperti, ini tidak mengkompilasi:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Tapi ini memang:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Dan ini tidak dapat dikompilasi:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
sumber
[stmt.label]/1
dan satu untuk makro[cpp]/8
.Jawaban:
The ruang nama jangka mungkin lebih mapan di C Standar ISO; mengutip ISO C11 :
Namun definisi ruang nama baru dari C ++, sama sekali tidak baru-baru ini , dan telah dijelaskan dalam [diff.class] / 1 dalam bentuknya saat ini sejak diperkenalkannya standar ISO C ++ di tahun '98 . Ini hanya pernah disebutkan dalam konteks apa pun yang berbeda dari ISO C, sesuai [diff.class] / 1 yang dikutip oleh OP.
Afaics kita perlu menggunakan ISO C11 / 6.2.3 dan menggabungkannya dengan [diff.class] / 1 dari ISO C ++ Standard untuk deskripsi yang kohesif dan lengkap tentang definisi ruang nama C ++ yang baru , lebih sedikit kita mencari ISO C ++ Standar untuk misalnya [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 dan seterusnya untuk melihat bagaimana dan di mana itu berlaku.
sumber
Dalam C (6.2.3 Ruang nama pengidentifikasi) pengertian ruang nama didefinisikan dengan cara berikut.
Jadi misalnya nama tag struktur dapat bertepatan dengan nama fungsi karena mereka milik ruang nama yang berbeda. Ketika Anda menentukan struktur dengan nama tag struktur ketika Anda harus menggunakan kata kunci
struct
. Jadi misalnya deklarasi ini tidak bertentangan.Dalam cuplikan kode ini nama tag
s
struktur tidak bertentangan dengan nama fungsis
karena nama tag harus ditentukan dengan kata kuncistruct
.Di C ++ Anda diizinkan menggunakan nama tag struktur tanpa kata kunci
struct
.Sebagai contoh
adalah kode yang benar. Dalam deklarasi ini
nama pengidentifikasi yang dinyatakan
s
menyembunyikan nama struktur. JADI kalau begitu Anda akan menulis misalnyamaka kompiler akan mengeluarkan kesalahan karena dalam pernyataan ini s dianggap sebagai nama pengidentifikasi yang dinyatakan di atas. Untuk menyelesaikan ambiguitas, Anda perlu menggunakan kata kunci struct
Ini dijelaskan dalam kutipan berikut dari Standar C ++ 20 (6.3.1 Wilayah dan cakupan deklaratif)
Seperti yang Anda lihat dari kutipan, nama namespace harus unik di wilayah deklaratifnya. Jadi deklarasi ini
salah
sumber