Barcha C++ standart kutubxona turlari va funktsiyalari stdnomlar maydonida yoki ichkariga joylashtirilgan nomlar bo'shliqlarida e'lon qilinadi std.
Ichki nom maydonlari
Nomlar bo'shliqlari o'rnatilgan bo'lishi mumkin. Quyidagi misolda ko'rsatilganidek, oddiy ichki o'rnatilgan nom maydoni o'zining ota-ona a'zolariga malakasiz kirish huquqiga ega, lekin ota-ona a'zolari ichki o'rnatilgan nomlar maydoniga (agar u inline sifatida e'lon qilinmasa) malakasiz kirish huquqiga ega emas:
namespace ContosoDataServer
{
void Foo();
int Bar(){...};
int Baz(int i) { return Details::CountImpl; }
}
Oddiy ichki o'rnatilgan nomlar bo'shliqlari ota-ona nomlar maydonining umumiy interfeysining bir qismi bo'lmagan ichki amalga oshirish tafsilotlarini qamrab olish uchun ishlatilishi mumkin.
Inline nom maydonlari (C++ 11)
Oddiy ichki nom maydonidan farqli o'laroq, ichki nomlar maydoni a'zolari ota-ona nom maydonining a'zolari sifatida ko'rib chiqiladi. Bu xususiyat haddan tashqari yuklangan funksiyalarni argumentga bog‘liq holda qidirishni ota-ona va ichki o‘rnatilgan nom maydonida ortiqcha yuklangan funksiyalar ustida ishlash imkonini beradi. Shuningdek, u inline nom maydonida e'lon qilingan shablon uchun ota-ona nom maydonida ixtisoslashuvni e'lon qilish imkonini beradi. Quyidagi misol tashqi kodning sukut bo'yicha ichki nom maydoniga qanday bog'lanishini ko'rsatadi:
//Header.h
#include
namespace Test
{
namespace old_ns
{
std::string Func() { return std::string("Hello from old"); }
}
int main()
{
using namespace Test;
using namespace std;
string s = Func();
std::cout << s << std::endl; // "Hello from new"
return 0;
}
Quyidagi misol ichki nom maydonida e'lon qilingan shablonning ota-onasida ixtisoslikni qanday e'lon qilishingiz mumkinligini ko'rsatadi:
namespace Parent
{
inline namespace new_ns
{
template struct C
{
T member;
};
}
template<>
class C {};
}
Kutubxonaning umumiy interfeysidagi o'zgarishlarni boshqarish uchun versiya mexanizmi sifatida inline nom maydonlaridan foydalanishingiz mumkin. Masalan, siz bitta ota-ona nom maydonini yaratishingiz va interfeysning har bir versiyasini ota-ona ichiga joylashtirilgan o'z nom maydoniga joylashtirishingiz mumkin. Eng so'nggi yoki afzal qilingan versiyani o'z ichiga olgan nom maydoni inline sifatida tasniflanadi va shuning uchun u ota-ona nom maydonining bevosita a'zosi kabi ko'rsatiladi. Parent::Classni chaqiruvchi mijoz kodi avtomatik ravishda yangi kodga ulanadi. Eski versiyadan foydalanishni ma'qul ko'rgan mijozlar ushbu kodga ega bo'lgan ichki nomlar maydoniga to'liq malakali yo'ldan foydalangan holda unga kirishlari mumkin.
Inline kalit so'zi kompilyatsiya birligidagi nomlar maydonining birinchi deklaratsiyasiga qo'llanilishi kerak.
Quyidagi misol interfeysning ikkita versiyasini ko'rsatadi, ularning har biri ichki nomlar maydonida. Nomlar maydoni interfeysdan v_20ba'zi o'zgarishlarga ega v_10va inline sifatida belgilangan. Yangi kutubxona va qo'ng'iroqlardan foydalanadigan mijoz kodi Contoso::Funcs::Addv_20 versiyasini ishga tushiradi. Qo'ng'iroq qilishga urinayotgan kod Contoso::Funcs::Divideendi kompilyatsiya vaqtida xatolikni oladi. Agar ularga haqiqatan ham ushbu funktsiya kerak bo'lsa, ular v_10aniq qo'ng'iroq qilish orqali versiyaga kirishlari mumkin Contoso::v_10::Funcs::Divide.
namespace Contoso
{
namespace v_10
{
template class Funcs
{
public:
Funcs(void);
T Add(T a, T b);
T Subtract(T a, T b);
T Multiply(T a, T b);
T Divide(T a, T b);
};
}
inline namespace v_20
{
template class Funcs
{
public:
Funcs(void);
T Add(T a, T b);
T Subtract(T a, T b);
T Multiply(T a, T b);
std::vector Log(double);
T Accumulate(std::vector nums);
};
}
}