Обосновката за вградените пространства от имена на C++ е едновременно изходен код и двоична съвместимост (вижте статията на Herb Sutter, свързана в N2535), но не успях да намеря добри примери за запазване двоична съвместимост за съществуващи библиотеки при въвеждане на вградени пространства от имена или ако е възможно .
(за повече информация и примери за съвместимост на източника вижте този въпрос)
(за разрешаване на свързан проблем, използване на вградено пространство от имена за въвеждане на несъвместимост, вижте този въпрос)
Ако това е нашата текуща библиотека (напр. mylib.dll), която се споделя с клиенти и трябва да е стабилна:
struct ModelA
{
/* (...) lots of stuff */
};
struct ModelB
{
/* (...) lots of stuff */
};
Можем ли да използваме вградени пространства от имена, за да въведем нови версии на структурите/класовете, без да прекъсваме клиентите (т.е. да заменим само файла на споделената библиотека (mylib.dll), без да е необходимо повторно компилиране)?
inline namespace mylib
{
inline namespace v1
{
struct ModelA
{
/* (...) lots of stuff */
};
} // end namespace v1
namespace v2
{
struct ModelA
{
/* (...) lots of stuff + newstuff */
};
} // end namespace v2
struct ModelB
{
/* (...) lots of stuff */
};
} // end namespace mylib
Ако не, ще работи ли без включващото вградено пространство от имена mylib?