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;
}

 

感觉还是函数指针更好理解

 

posted @ 2025-11-12 16:51  年华似水゛  阅读(10)  评论(0)    收藏  举报