2015-12-05 3 views
-1

Я только начал изучать C, и я думаю, что я не совсем понял использование typedef.C: О typedef и enum

Рассмотрим этот код:

#include <stdio.h> 

enum _season{spring=1, summer, autumn, winter} season; 

int main() 
{ 
    int val; 
    printf(" enter the number of the season: "); 
    scanf("%d", &val); 

    season = val; 

    switch (season) { 
     case 1: 
      printf("spring"); 
      break; 
     case 2: 
      printf("summer"); 
      break; 
     case 3: 
      printf("autumn"); 
      break; 
     case 4: 
      printf("winter"); 
      break; 
     default: 
      printf("the seasons are only 4"); 
    } 
    return 0; 
} 

Он работает без ЬурейеЕ. Я видел пример с использованием typedef, а некоторые не используют его, поэтому теперь я немного смущен, и я не понимаю, когда я должен использовать typedef, а когда нет?

Не могли бы вы дать мне краткое объяснение, пожалуйста?

Спасибо за ответ

+1

заглавных букв и формат в коде. –

ответ

-1

typedef определяет новый тип данных. Таким образом, вы можете иметь:

typedef char* my_string; 
typedef struct{ 
    int member1; 
    int member2; 
}my_struct 

Итак, теперь вы можете объявлять переменные с этими новыми типами данных

my_string s; 
my_struct x; 

s = "welcome"; 
x.member1 = 10; 

Для Enum, вещи немного по-другому - рассмотрим следующие примеры:

enum Ranks {FIRST, SECOND}; 
int main() 
{ 
    int data = 20; 
    if (data == FIRST) 
    { 
     //do something 
    } 
} 

enum - целочисленный тип; первое значение в перечислении равно 0 (если не указано иное) второе - это первое значение + 1 (0 + 1 в этом случае) и так далее. Когда вы объявляете переменную типа enum_data_type, вы можете назначать ей только те значения, которые существуют в перечислении .... компилятор выполняет проверку.
так вот в theexample, if(data==FIRST) is false

с использованием ЬурейеЕ перечисления предотвращает другие значения, вставленные в перечислении:

typedef enum Ranks {FIRST, SECOND} Order; 
int main() 
{ 
    Order data = 20; //ERROR 20 is not a Order 
    if (data == FIRST) 
    { 
     //do something 
    } 
} 
+0

«typedef» определяет новый тип данных «Нет. Он просто определяет псевдоним для типа. C использует совместимость по структуре, а не по имени/typedef. – Olaf

+0

@Olaf Я понимаю, что вы имеете в виду, но не работает этот псевдоним как тип данных и то, что я обнаружил, что много мест, о которых упоминается таким же образом, см. По этой ссылке http://www.tutorialspoint.com/cprogramming/c_typedef. htm –

+0

Просто прочитайте стандарт о [совместимости типов] (http://port70.net/~nsz/c/c11/n1570.html#6.2.7). Это единственная обязательная ссылка. Однако, пожалуйста, внимательно прочитайте первое предложение связанного учебника. В нем точно указано, что я написал. – Olaf

0

Есть много применений typedef с. Процитировать несколько

1) typedef s может использоваться для упрощения переноса программ. Если typedef s используются для типов данных, которые могут быть не зависящими от машины, то при перемещении программы необходимо изменить typedef.


2) Он может быть использован для обеспечения лучшей документации для программы. Тип, называемый Treeptr, может быть проще понять, а затем объявлен только как указатель на сложную структуру.

Источник: The C programming Language

-1

Вы не перепутать ЬурейеЕ и определить? Если вы выполните:

При использовании define вам нужно указать значения, соответствующие вашему тексту (не всегда числовые), с помощью перечисления, значения будут связаны автоматически. Если это так, вы не должны использовать числовые значения в своем коммутаторе, но текст, который вы определили