Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译时确定的对C函数的引用_C_Makefile - Fatal编程技术网

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

编译时确定的对C函数的引用,c,makefile,C,Makefile,我正试图为我目前正在编写的C程序想出最优雅的解决方案。基本上,我有一个小的核心程序,然后是许多附加的“模块”,它们可以被核心程序调用,并包含大部分功能。其思想是,这些模块的核心和每个模块都是独立的 这些模块的包含是在编译时确定的,一旦我注册了它们,那么核心就有了指向模块的函数指针,然后它就可以使用了。。。。但是,首先让这些模块以最小的依赖关系注册的最佳方式是什么?我目前正在使用一种“模块工厂”类型的方法,它了解模块,并被核心调用以获取其注册的详细信息。但我想知道,通过make和预处理器,是否有更

我正试图为我目前正在编写的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显式确定。我认为我可能能够通过预处理器将当前模块传递到“工厂”——我不希望自动生成文件,但通过预处理器传递这些细节可能会允许我基于该信息创建模块表。我想其他人在某个时候也会采用类似的设计方法,所以一定会有最有效的设计经验。耶,我想我将不得不这样做——尽管正如你所说,它并不特别优雅。