2016-10-03 26 views
0

全球链接变量我想在C程序中有些插件系统的实现。插件将被编译为共享库并在编译期间链接。使用一个名称

比方说,我有一个单向链表结构定义:

struct plugin_iface 
{ 
    int data, 
    struct plugin_iface* next 
}; 

每个插件创建这个结构的全局实例,所有这些实例都具有相同的名字:

struct plugin_iface IfaceList = 
{ 
    .data = 42, 
    .next = &IfaceList 
} // Defined in the global scope in each plugin 

如我所预计,next指向它的父母 - 在这个插件。值得一提的是,这样的方案建立和链接没有错误。如果我在main.c

extern struct plugin_iface IfaceList; 

,它解决了在建并链接了最新的插件实例。

现在我想实现的是让所有的变量情况下,形成一个链表。该列表中的每个节点都将代表一个插件的接口。这在C中甚至可能吗?我想避免任何配置时生成头文件。

+0

编译期间链接?或运行时间? –

+2

我会模仿类似Linux的设备驱动程序的注册方案。一个插件创建自己的'struct plugin_iface'并将其传递给某个实体,该实体可能使用链接列表来管理这些实体。这样,插件不会受到链表的实现细节的困扰,而只需执行'register_plugin(&plugin_iface)'。 – Downvoter

+0

@Downvoter该方法的问题是必须执行插件中的代码才能调用注册函数。我们不能简单地从每个插件调用一个函数,因为我们在'main'时不知道他们的名字。 –

回答

1

我建议不解决使用链接器和C语言的“含蓄”这个问题。

相反,专门将一plugins文件夹中的分布,并检测,负载和初始化在运行时放置在那里的任何共享库。

相关问题