У нас есть структура в ревизии 1 разделяемой библиотеки, для которой нам нужно поддерживать ABI:
struct Person
{
std::string first_name;
std::string last_name;
}
В ревизии 2 мы меняем Person на это:
class Person
{
public:
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
Чтобы обеспечить совместимость с исходным кодом, мы хотели бы изменить версию 1 Person так, чтобы код, скомпилированный с более новыми заголовочными файлами, запускался, а код, не перекомпилированный, запускался.
Можем ли мы сделать следующее с двумя новыми не встроенными конструкторами:
class Person
{
public:
Person();
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
Мы делаем все это с помощью g ++. Просматривая сгенерированную разделяемую библиотеку с помощью nm, я не вижу конструктора или деструктора для простой структуры, поэтому я предполагаю, что код, который не перекомпилируется, просто создаст Person на вызывающем сайте, как и раньше, что нормально. Любой перекомпилированный код будет использовать конструктор без аргументов.
Единственная проблема, которую я вижу, заключается в том, что если нам нужно откатиться к более старой версии разделяемой библиотеки, в которой нет конструкторов, тогда любой код, скомпилированный против нее, сломается, но я не беспокоюсь об этой ситуации.