Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “计算枚举”;“字符串”;从价值_C - Fatal编程技术网

C “计算枚举”;“字符串”;从价值

C “计算枚举”;“字符串”;从价值,c,C,因此,我有下面的枚举,我有一些状态,在每个状态中,我希望根据事件id打印状态实例。那么,有没有一种方法可以从其值计算枚举“字符串” typedef枚举{ WIFI_启动, WIFI_DIS, 无线上网 }地位; void eventHandler(int event\u id) { 如果(事件id==WIFI\u启动){ // ... printf(“WIFI_启动被触发”); } ... } 最不聪明的方法是分配一些与枚举对齐的字符串常量,并使用枚举索引到其中: #include <st

因此,我有下面的枚举,我有一些状态,在每个状态中,我希望根据
事件id
打印
状态
实例。那么,有没有一种方法可以从其值计算枚举“字符串”

typedef枚举{
WIFI_启动,
WIFI_DIS,
无线上网
}地位;
void eventHandler(int event\u id)
{
如果(事件id==WIFI\u启动){
// ...
printf(“WIFI_启动被触发”);
}
...
}

最不聪明的方法是分配一些与枚举对齐的字符串常量,并使用枚举索引到其中:

#include <stdio.h>

typedef enum {
   WIFI_START,
   WIFI_DIS,
   WIFI_CON
} STATUS;

const char *status[] = {"WIFI_START", "WIFI_DIS", "WIFI_CON"};

void eventHandler(int event_id) {
    printf("%s is triggered", status[event_id]);
}

int main() {
    eventHandler(WIFI_DIS);
    return 0;
}
#包括
类型定义枚举{
WIFI_启动,
WIFI_DIS,
无线上网
}地位;
const char*status[]={“WIFI\u启动”、“WIFI\u显示”、“WIFI\u控制”};
void eventHandler(int event\u id){
printf(“%s已触发”,状态[事件id]);
}
int main(){
事件处理程序(WIFI_DIS);
返回0;
}

我更喜欢这个宏,因为除了调试/开发实用程序之外,程序逻辑应该与程序用来表示数据的名称解耦。换句话说,程序的行为不应该基于变量名特征而有所不同;应该可以缩小、模糊或重构源代码,并保证您仍能获得相同的输出。

最不聪明的方法是分配一些与枚举对齐的字符串常量,并使用枚举索引到其中:

#include <stdio.h>

typedef enum {
   WIFI_START,
   WIFI_DIS,
   WIFI_CON
} STATUS;

const char *status[] = {"WIFI_START", "WIFI_DIS", "WIFI_CON"};

void eventHandler(int event_id) {
    printf("%s is triggered", status[event_id]);
}

int main() {
    eventHandler(WIFI_DIS);
    return 0;
}
#包括
类型定义枚举{
WIFI_启动,
WIFI_DIS,
无线上网
}地位;
const char*status[]={“WIFI\u启动”、“WIFI\u显示”、“WIFI\u控制”};
void eventHandler(int event\u id){
printf(“%s已触发”,状态[事件id]);
}
int main(){
事件处理程序(WIFI_DIS);
返回0;
}

我更喜欢这个宏,因为除了调试/开发实用程序之外,程序逻辑应该与程序用来表示数据的名称解耦。换句话说,程序的行为不应该基于变量名特征而有所不同;应该可以缩小、模糊或重构源代码,并保证您仍能获得相同的输出。

为什么不使用映射到枚举索引的字符串数组,即
char*status[]={“WIFI_START”,…}
?您可以使用一点宏魔法。不,一旦有了上面的数组,只需编写
printf即可(“%s被触发\n”,状态[event_id]);
,对吗?
WIFI_START==0
等等。请记住,枚举只不过是引入命名符号整数常量的一种方式。除非显式更改(问题中的枚举不做此更改)第一个数组的值总是
0
,其余的值总是比前一个大。这就是为什么可以直接用作数组索引的原因。您可以在自己的代码中定义和初始化这样一个名称数组,而不依赖于定义枚举的库。@Pokloha no,在程序中定义与e到您的枚举不是多余的。如前所述,您可以将枚举视为数字的别名,以提高可读性。除了生成一个表示该数字的字符串数组外,无法将该数字协调为字符串。这是一个好的设计,也是一个坏的设计。有时供应商会提供一个toString或errstr函数,可以为您进行此转换,但即使这样,您也可能希望创建自己的字符串,您可以自定义到库中。为什么不使用映射到枚举索引的字符串数组,即
char*status[]={“WIFI_START”,…}
?你可以用一点宏魔法。不,一旦你有了上面的数组,只需写
printf(“%s已触发”\n“,status[event\u id]);
,对吗?
WIFI\u START==0
等等。记住枚举只不过是引入命名符号整数常量的一种方式。除非明确更改(问题中的枚举没有这样做)第一个数组的值总是
0
,其余的值总是比前一个大。这就是为什么可以直接用作数组索引的原因。您可以在自己的代码中定义和初始化这样一个名称数组,而不依赖于定义枚举的库。@Pokloha no,在程序中定义与e到您的枚举不是多余的。如前所述,您可以将枚举视为数字的别名,以提高可读性。除了生成一个表示该数字的字符串数组外,无法将该数字协调为字符串。这是一个好的设计,也是一个坏的设计。有时供应商会提供一个toString或errstr函数,它可以为您进行此转换,但即使如此,也可能需要创建您自己的字符串,您可以自定义到您的库中。