c中的typedef枚举说明

ult*_*nna 2 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;
Run Code Online (Sandbox Code Playgroud)

在ADC的main.c中有以下代码行

adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};
Run Code Online (Sandbox Code Playgroud)

我想知道为什么你需要为ADC声明新的数据类型?什么typedef枚举意味着什么?

谢谢

Tom*_*sen 6

作为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, 
};
Run Code Online (Sandbox Code Playgroud)

然后该行adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};必须写为:

enum adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5};
Run Code Online (Sandbox Code Playgroud)

typedef让我们忽视了enum在每次使用的类型.

使用有用的常量通常比"魔术数字"更受欢迎,尽管在这种情况下,常量可能看起来有点奇怪,常量几乎没有提供额外的信息.然而,它可以是有用的,因为枚举器用作额外的描述.例如,期望类型值的IDE将adc_channel_t能够建议通道:ADC_CH_0通过ADC_CH_6可能是有效的值范围,而不是简单地告诉您使用数字.


Red*_*edX 5

这样做的原因有很多。

  1. typedef是做什么的
  2. 为什么用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.
Run Code Online (Sandbox Code Playgroud)

C语言中的第二个,您需要始终指定enumstruct引用它们:

enum CarModels_e {
    Bravia,
    Uno
};


enum CarModels_e the_model;
enum CarModels_e other_model
// this gets boring fast...
Run Code Online (Sandbox Code Playgroud)

因此,程序员(懒惰的人)将尽量避免过多输入。为此,他们创建了一个新类型:

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!
Run Code Online (Sandbox Code Playgroud)

但是仍然必须键入两次,enum CarModels_e以便它们也可以在一个声明中进行组合:

typedef enum /* Don't even need a name here anymore! Much less typing :) */ {
    Bravia,
    Uno
} CarModels;
Run Code Online (Sandbox Code Playgroud)

为什么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!
Run Code Online (Sandbox Code Playgroud)


art*_*rtm 2

我想知道为什么需要为 ADC 声明新的数据类型?typedef enum 是什么意思?

typedef enum是一种对相关常量进行分组的方法。您可以改为声明 7 个constfrom ADC_CH_0to ADC_CH_6,但因为它们都是相关的,所以最好enum在此处使用(每个enum常量默认增加 1)。

您稍后可以使用 typeadc_channel_t来声明变量,并且范围保证在声明的枚举常量内。