编译时确定的对C函数的引用
我正试图为我目前正在编写的C程序想出最优雅的解决方案。基本上,我有一个小的核心程序,然后是许多附加的“模块”,它们可以被核心程序调用,并包含大部分功能。其思想是,这些模块的核心和每个模块都是独立的 这些模块的包含是在编译时确定的,一旦我注册了它们,那么核心就有了指向模块的函数指针,然后它就可以使用了。。。。但是,首先让这些模块以最小的依赖关系注册的最佳方式是什么?我目前正在使用一种“模块工厂”类型的方法,它了解模块,并被核心调用以获取其注册的详细信息。但我想知道,通过make和预处理器,是否有更好的方法“自动发现”哪些模块已经编译成内核编译时确定的对C函数的引用,c,makefile,C,Makefile,我正试图为我目前正在编写的C程序想出最优雅的解决方案。基本上,我有一个小的核心程序,然后是许多附加的“模块”,它们可以被核心程序调用,并包含大部分功能。其思想是,这些模块的核心和每个模块都是独立的 这些模块的包含是在编译时确定的,一旦我注册了它们,那么核心就有了指向模块的函数指针,然后它就可以使用了。。。。但是,首先让这些模块以最小的依赖关系注册的最佳方式是什么?我目前正在使用一种“模块工厂”类型的方法,它了解模块,并被核心调用以获取其注册的详细信息。但我想知道,通过make和预处理器,是否有更
过去我使用过动态加载的库,但在这种情况下,我的模块需要编译,因此从目录中动态加载一组库并以这种方式解决它不是一个选项。我不太确定我是否理解这个问题,但我想你也可以用宏创建一些半模糊的东西。我真的不推荐它,但不管它值多少钱 假设您有一个称为“module_this”的模块和另一个称为“module_that”。还有一个“module_missing”,它不是用程序编译的 然后,您可以创建如下内容: 模块_this.h
#ifndef MODULE_THIS // your ordinary header guard
#define MODULE_THIS module_this, // add a function name plus a comma
void module_this (void);
#endif
模块_.h
#ifndef MODULE_THAT // your ordinary header guard
#define MODULE_THAT module_that, // add a function name plus a comma
void module_that (void);
#endif
核心c
#include "something that includes all linked files.h" // generate this externally
#ifndef MODULE_THIS // this module is compiled
#define MODULE_THIS // so it wont get defined here
#endif
#ifndef MODULE_MISSING // module that was not compiled
#define MODULE_MISSING // will get defined as empty macro
#endif
#ifndef MODULE_THAT // this module is compiled
#define MODULE_THAT // so it wont get defined here
#endif
typedef void(*module_t)(void); // your function pointer type to use
static const module_t MODULE_TABLE [] = // list of all existing modules
{
MODULE_THIS // note absence of commas
MODULE_MISSING
MODULE_THAT
};
#define MODULES_N ( sizeof(MODULE_TABLE) / sizeof(module_t) )
...
printf("There are %d modules in the project.", MODULES_N);
这依赖于从脚本/make文件创建的头文件,其中包含大量的
#include
如何决定将哪些模块编译到应用程序中?该进程可以为编译器添加预处理器宏吗?或者使用模块表自动生成某个文件?Joachim-它当前由makefile显式确定。我认为我可能能够通过预处理器将当前模块传递到“工厂”——我不希望自动生成文件,但通过预处理器传递这些细节可能会允许我基于该信息创建模块表。我想其他人在某个时候也会采用类似的设计方法,所以一定会有最有效的设计经验。耶,我想我将不得不这样做——尽管正如你所说,它并不特别优雅。