有没有办法为未来的添加准备一个结构?

nak*_*iya 2 c++ struct shared-objects

我有以下结构将用于保存插件信息.我很确定这会随着时间的推移而改变(最可能添加).假设这个文件将被修复,这里有什么比我做的更好吗?

struct PluginInfo
{
    public:
        std::string s_Author;
        std::string s_Process;
        std::string s_ReleaseDate;
        //And so on...

        struct PluginVersion
        {
            public:
                std::string s_MajorVersion;
                std::string s_MinorVersion;
                //And so on...
        };
        PluginVersion o_Version;

        //For things we aren't prepared for yet.
        void* p_Future;
};
Run Code Online (Sandbox Code Playgroud)

此外,在为此系统构建共享对象时,是否应采取任何预防措施.我的预感是我会遇到很多库兼容性问题.请帮忙.谢谢

Rol*_*lig 6

怎么样,或者我觉得太简单了?

struct PluginInfo2: public PluginInfo
{
    public:
        std::string s_License;
};
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中,您可能只传递指向PluginInfos的指针,因此版本2与版本1兼容.当您需要访问版本2成员时,您可以使用其中一个dynamic_cast<PluginInfo2 *>或使用显式pluginAPIVersion成员来测试版本.


Pet*_*ham 6

您的插件是使用相同版本的C++编译器和std库源编译的(或者它的std :: string实现可能不兼容,并且所有字符串字段都会中断),在这种情况下,您必须重新编译插件,并且向结构添加字段无关紧要

或者你想要与以前的插件二进制兼容,在这种情况下坚持使用普通数据和固定大小的char数组(或者提供一个API来根据大小为字符串分配内存或传入一个const char*),在这种情况下它不是闻所未闻的是在结构中有一些未使用的字段,然后在需要时将它们更改为有用的命名项.在这种情况下,在结构中有一个字段来说明它代表哪个版本也很常见.

但是很少期望二进制兼容性并使用std :: string.您永远无法升级或更改编译器.