从C预处理器获取"编号"配置选项的最佳方法是什么?

jhe*_*ngs 0 c c-preprocessor

我们有一个库,可以访问设备上的按钮.这些按钮被枚举为系统的其余部分,如"电源按钮"等.这样,其余应用程序就不必担心"电源按钮"的实现方式.

我们使用一些看起来像这样(简化)的配置指令来构建这个库:

#define BUTTON_COUNT 2
#define BUTTON_0_NAME "power"
#define BUTTON_1_NAME "reset"
#define BUTTON_2_NAME NULL
Run Code Online (Sandbox Code Playgroud)

问题是,在某些时候我想获取按钮1的名称.理想情况下,我会通过创建一个类似的函数来做到这一点get_button_name(int index).问题是,我找不到一个很好的方法来获得该函数中的编号配置选项.当前的实现如下:

const char* get_button_name(int index) {
    switch (index) {
        case 0: return BUTTON_0_NAME;
        case 1: return BUTTON_1_NAME;
        case 2: return BUTTON_2_NAME;
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

问题是,这个代码是为许多设备共享的,因此支持的按钮数量将继续增加.这意味着更改此功能,所有拉入它的设备都必须#define为新按钮添加.

我真的更喜欢(尽管我认为预处理器不可能)是这样的:

const char* get_button_name(int index) {
    if (index < BUTTON_COUNT) {
        return BUTTON_ ## index ## _NAME;
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

想要更好的解决方案吗?

Mic*_*hař 5

有阵列怎么样?

 const char *buttons[] = {
   "power",
   "reset"};

 const char* get_button_name(int index) {
     if (index < sizeof(buttons)/sizeof(buttons[0])) {
         return buttons[index];
     }
     return NULL;
 }
Run Code Online (Sandbox Code Playgroud)