c高级用法(x-macro)
x-macro 的例子,
#include <stdio.h>
#define MACROS_TABLE \
X_MACROS(CMD_LED_ON, led_on) \
X_MACROS(CMD_LED_OFF, led_off)
/*定义命令列表*/
typedef enum
{
#define X_MACROS(a, b) a,
MACROS_TABLE
#undef X_MACROS
CMD_MAX
} cmd_e;
/*定义字符串列表用作Log打印*/
const char *cmd_str[] = {
#define X_MACROS(a, b) #a,
MACROS_TABLE
#undef X_MACROS
};
typedef void (*func)(void *p);
static void led_on(void *p)
{
printf("%s \r\n", (char *)p);
}
static void led_off(void *p)
{
printf("%s \r\n", (char *)p);
}
/*定义函数列表*/
const func func_table[] = {
#define X_MACROS(a, b) b,
MACROS_TABLE
#undef X_MACROS
};
/*直接通过索引的方式调用函数*/
static void cmd_handle(cmd_e cmd)
{
if (cmd < CMD_MAX)
{
func_table[cmd]((void *)cmd_str[cmd]);
}
}
void main(void)
{
cmd_handle(CMD_LED_ON);
cmd_handle(CMD_LED_OFF);
}
此功能也可以通过 函数指针 来实现
#include <stdio.h>
#include <string.h>
// 定义命令处理函数类型
typedef void (*CommandHandler)(const char*);
// 命令结构体(模拟虚函数表)
typedef struct {
const char* name; // 命令名称(替代cmd_str)
CommandHandler handler; // 处理函数(替代func_table)
} Command;
// 命令实现(模拟派生类)
static void led_on(const char* param) {
printf("LED_ON: %s\r\n", param);
}
static void led_off(const char* param) {
printf("LED_OFF: %s\r\n", param);
}
// 命令表(替代宏定义的三个数组)
static const Command commands[] = {
{"LED_ON", led_on},
{"LED_OFF", led_off}
};
// 命令数量
static const int CMD_MAX = sizeof(commands) / sizeof(Command);
// 命令处理函数(替代原cmd_handle)
void cmd_handle(const char* cmd_name, const char* param) {
for (int i = 0; i < CMD_MAX; i++) {
if (strcmp(commands[i].name, cmd_name) == 0) {
commands[i].handler(param); // 动态绑定处理函数
return;
}
}
printf("Unknown command: %s\r\n", cmd_name);
}
int main(void) {
// 使用示例
cmd_handle("LED_ON", "Turn on device");
cmd_handle("LED_OFF", "Turn off device");
return 0;
}
感觉还是函数指针更好理解

浙公网安备 33010602011771号