2015-12-07 2 views
2

Я ищу файл заголовка для АЦП на микроконтроллере, и в нем находится следующий код.typedef enum explain in c

/** 
* 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; 

И в main.c для АЦП есть следующая строка кода

adc_channel_t channels[] = {ADC_CH_4, ADC_CH_5}; 

мне было интересно, почему бы вам нужно объявлять новые типы данных для АЦП? и что означает typedef enum?

Благодаря

+1

'typedef' просто используется для обозначения аббревиатуры для типа, поэтому вам не нужно повторять все это каждый раз, когда вы его используете. – Barmar

+1

Нет ничего особенного в том, чтобы использовать его для сокращения типа 'enum'. – Barmar

+1

Не обязательно, чтобы вы создавали новый тип данных для АЦП. Перечисление - это int, который вы можете использовать как идентификатор для группы констант. С точки зрения читабельности становится понятным позже в коде, что 'ADC_CH_0' (который имеет значение 0) является точно каналом 0. Простое использование целых чисел для указанной группы - это ожидание. Enums помогают сохранить чистоту. – Talaria

ответ

1

мне было интересно, почему бы вам нужно объявлять новые типы данных для АЦП? и что означает typedef enum?

typedef enum - способ группировки связанных констант. Вместо этого вы можете указать семь const от ADC_CH_0 до ADC_CH_6, но поскольку все они связаны, лучше использовать здесь enum (с каждой константой enum по умолчанию увеличивается на 1).

Вы можете использовать тип adc_channel_t, чтобы объявить переменные, причем диапазон гарантированно будет находиться в объявленных константах перечисления.

3

В дополнение к ответу 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, которые могут быть допустимым диапазоном значений, а не просто указывать вам номер.

2

Существует множество компонентов, почему это делается.

  1. Что ЬурейеЕ сделать
  2. Почему ЬурейеЕ перечисление

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 необходимо указать Alway 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! 
+1

Чтобы быть педантичным, если вы действительно хотите сделать свое намерение более ясным, ваш 'typedef char uint8;' должен быть либо 'typedef unsigned char uint8; ', либо' typedef char int8; ', поскольку' u' обычно подразумевает, что type - без знака;). – NiBZ

+1

@NiBZ хороший пункт. Исправлена. – RedX