Обоснование для внутренних пространств имен С++ является как исходной, так и двоичной совместимостью (см. документ Герба Саттера, связанный в N2535), но у меня есть не смогли найти хороших примеров сохранения двоичной совместимости для существующих библиотек при введении встроенных пространств имен или, если это возможно.
(для получения дополнительной информации и примеров совместимости источников см. этот вопрос)
(для решения связанной задачи, используя встроенное пространство имен для представления несовместимости, см. этот вопрос)
Если это наша текущая библиотека (например, mylib.dll), которая используется совместно с клиентами и должна быть стабильной:
struct ModelA
{
/* (...) lots of stuff */
};
struct ModelB
{
/* (...) lots of stuff */
};
Можем ли мы использовать inline namespaces для представления новых версий структур/классов без разрыва клиентов (т.е. заменить файл общей библиотеки (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?