c中的typedef枚举说明
我正在查看微控制器上ADC的头文件,其中包含以下代码。
/** * ADC channels type. */ typedef enum { ADC_CH_0, ADC_CH_1, ADC_CH_2, ADC_CH_3, ADC_CH_4, ADC_CH_5, ADC_CH_6, } adc_channel_t;
在ADC的main.c中,有以下代码行
adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};
我想知道为什么你需要为ADC声明新的数据类型? 什么typedef枚举意味着什么?
谢谢
作为artm答案的补充,在enum
前添加了typedef
,以便于使用enum
。 如果声明看起来像这样:
enum adc_channel_t { ADC_CH_0, ADC_CH_1, ADC_CH_2, ADC_CH_3, ADC_CH_4, ADC_CH_5, ADC_CH_6, };
然后行adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};
必须写成:
enum adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};
typedef
允许我们在每次使用类型时忽略enum
。
使用有用的常量通常比“魔术数字”更受欢迎,尽管在这种情况下,常量可能看起来有点奇怪,常量几乎没有提供额外的信息。 然而,它可以是有用的,因为枚举器用作额外的描述。 例如,期望值为adc_channel_t
IDE的IDE将能够建议通道: ADC_CH_0
到ADC_CH_6
,它们可能是有效的值范围,而不是简单地告诉您使用数字。
有多个组件可以解决这个问题的原因。
- typedef做什么
- 为什么要键入ende
typedef
允许您定义新类型。 这使您可以更清楚地表达您的意图。
char id; // but my id is a number! typedef unsigned char uint8; // ok now we can use uint8 instead of char uint8 id; // better! Now we know we should only interpret id as a number.
在C中,你需要在引用那些时指定enum
和struct
:
enum CarModels_e { Bravia, Uno }; enum CarModels_e the_model; enum CarModels_e other_model // this gets boring fast...
所以程序员(懒惰的人)会尽量避免打字。 为此,他们创建了一个新类型:
typedef enum CarModels_e CarModels; // now we don't need to type enum every time! CarModels the_model; CarModels other_model // Less typing! Happier programmer!
但是你仍然需要输入两次enum CarModels_e
所以他们在一个声明中也将它们结合起来:
typedef enum /* Don't even need a name here anymore! Much less typing :) */ { Bravia, Uno } CarModels;
为什么直接使用enum
而不是数字? 因为这样你可以赋予数字意义。 因此,下次他们(或其他任何人)阅读他们的代码时,他们仍然知道这些数字是什么。
// Example if (measured_frequency == 12345) { // hmm where does this come from? if (measured_frequency == MaximumMotorFrequency) { // Ah! Now i'll know what this is about in ten years!
我想知道为什么你需要为ADC声明新的数据类型? 什么typedef枚举意味着什么?
typedef enum
是一种对相关常量进行分组的方法。 你可以改为从ADC_CH_0
到ADC_CH_6
声明七个const
,但由于它们都是相关的,所以最好在这里使用enum
(每个enum
常量默认增加1)。
您可以稍后使用类型adc_channel_t
来声明变量,其范围保证在声明的枚举常量内。