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_0ADC_CH_6 ,它们可能是有效的值范围,而不是简单地告诉您使用数字。

有多个组件可以解决这个问题的原因。

  1. typedef做什么
  2. 为什么要键入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中,你需要在引用那些时指定enumstruct

 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_0ADC_CH_6声明七个const ,但由于它们都是相关的,所以最好在这里使用enum (每个enum常量默认增加1)。

您可以稍后使用类型adc_channel_t来声明变量,其范围保证在声明的枚举常量内。