我正在查看微控制器上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的答案的typedef
补充,在前面添加了enum
,以便于使用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
在每次使用的类型.
使用有用的常量通常比"魔术数字"更受欢迎,尽管在这种情况下,常量可能看起来有点奇怪,常量几乎没有提供额外的信息.然而,它可以是有用的,因为枚举器用作额外的描述.例如,期望类型值的IDE将adc_channel_t
能够建议通道:ADC_CH_0
通过ADC_CH_6
可能是有效的值范围,而不是简单地告诉您使用数字.
这样做的原因有很多。
typedef是做什么的
为什么用typedef枚举
A 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!