gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:38:17 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我不太确定我是否理解这个问题,但我想你可以一如既往地用宏创建一些半模糊的东西。我真的不会推荐它,但就其值(value)而言......:

假设您有一个名为“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

核心.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

关于c - 对编译时确定的 C 函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com