在编译时确定对C函数的引用

时间:2014-03-04 12:57:44

标签: c makefile

我正在尝试为我正在编写的C程序考虑最优雅的解决方案。基本上,我有一个小核心程序,然后有许多额外的“模块”,可以由核心程序调用并包含大部分功能。我们的想法是核心和每个模块都是独立的。

这些模块的包含是在编译时确定的,一旦我注册它们,那么核心就有了它可以使用的模块的函数指针....但是在第一个模块中知道这些模块的最佳方法是什么注册的地方最小依赖?我目前正在使用“模块工厂”类型方法,该方法了解模块并由核心调用以获取其注册详细信息。但我想知道,通过make和预处理器是否可能有更好的方法“自动发现”哪些模块已经与核心编译?

过去我使用了动态加载的库,但在这种情况下我的模块需要编译,所以动态地从目录中加载一堆库并以这种方式解决它不是一种选择。

1 个答案:

答案 0 :(得分:0)

我不太确定我是否理解这个问题,但我想你可以像往常一样用宏来创造一些半模糊的东西。我不会真的推荐它,但值得的是......:

假设您有一个名为" module_this"另一个名为" module_that"。还有" module_missing"没有用程序编译。

然后你可以创建类似的东西:

module_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

module_that.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

core.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);

这依赖于从scripts / make文件创建的头文件,其中包含多个#include