如何用C实现动态调度表 https://stackoverflow.com/questions/11840651/how-can-i-implement-a-dynamic-dispatch-table-in-c/32192330#32192330
这本质上与链接的问题是同一个问题,所以......
因为您的 Strategy.c 显然已经知道该策略
按名称的实例 (#include "XYstrategy.h"
)你可以走整个
mile并使用头文件而不是实现文件来
将您的策略传达给中央调度员:
这与问题中明确的意图相悖。这是他如何静态执行此操作的示例,但希望模块在编译时动态注册自身。
让我尝试提供一个我为自己的目的而苦苦挣扎的例子......
我有一个微控制器,我想用它来读取报告温度和/或湿度的各种传感器。我有一个中央核心程序,负责格式化返回的数据并将其提交到 Web 服务器,并记录在 RRD 中。
我不想构建一个包含每种传感器类型的所有不同功能的大型单片程序,而是希望能够在加载到微控制器上的软件中构建一个特定的子集,该子集对应于安装在该特定控制器上的传感器。
为此,我希望能够为每个传感器编写一个具有三个功能的通用驱动程序:
bool _sensor_startup();
bool _read_sensor(float *temp, float *humidity, uint8_t max_count, uint8_t *count);
bool _sensor_shutdown();
The sensor_startup
该功能将负责为传感器供电,确保它们配置正确并处于准备状态read_sensor
被称为。如果此过程因任何原因失败,它将返回false
,否则返回true
.
The read_sensor
函数将导致最多max_count
要读取的传感器及其结果存储在指向的数组中temp
and humidity
, 分别。读取的传感器数量将存储在count
.
The sensor_shutdown
函数将执行任何必要的内务处理,将传感器和支持电子设备恢复到最低功耗配置。
其中每一个都包含在一个单独的 .c 文件中,该文件可能有一个相应的 .h 文件来定义相关常量、调用相关库等。
我想要一个主 Sensor.h 文件,该文件包含在 .c 或 .h 文件中,并定义:
typedef struct { startup_func, read_func, shutdown_func } sensor_driver_entry;
extern sensor_driver_entry sensor_table[];
然后我希望每个驱动程序文件都能够使用宏(或函数)在编译时在sensor_table 中的下一个开放槽中注册特定于类型的函数。
我希望在 Sensor.c 的全局命名空间中将传感器表声明为:
sensor_driver_entry sensor_table[MAX_SENSOR_TYPES];
(MAX_SENSOR_TYPES
将在 Sensor.h 中定义,反映可以选择的驱动程序的最大可能数量)。
这可能吗?如果是这样,有人可以提供语法示例吗?在这种特定情况下,我在粒子开发环境中为粒子光子进行编码,但如果我能让代码也可移植到 Arduino IDE,以便将其与 ESP8266 板一起使用,我会很高兴。