2015-03-15 2 views
-2

Существует 3 версии файла заголовка.Что такое 'typedef in C'?

версия 1:

typedef struct node 
{ 
    void* dataPtr; 
    struct node* link; 
} NODE; 

версия 2: без старого имени типа 'узла' (ЬурейеГо oldTypeName newTypeName)

typedef struct 
{ 
    void* dataPtr; 
    struct* link; 
} NODE; 

версии 3: без ЬурейеГо

struct 
{ 
    void* dataPtr; 
    struct* link; 
} NODE; 

Согласно C : typedef struct name {...}; VS typedef struct{...} name;, Версия 1, определяющая «узел», является излишней, и я изменил его на версию 2, и он работал нормально.

В соответствии с этим ответом снова, когда не используется «typedef», нельзя использовать «NODE».

Однако коды, использующие этот файл заголовка версии 3, работали нормально. (УЗЕЛ использовал два три раза.)

Это код:

/* Create a list with two linked nodes.*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include "version3.h"      //Header file 

int main (void) 
{ 
//Local Definitions 
    int* newData; 
    int* nodeData; 
    NODE* node; 

// Statements 
    newData = (int*)malloc (sizeof (int)); 
    *newData = 7; 
    node = createNode(newData); 

    newData = (int*)malloc (sizeof (int)); 
    *newData = 75; 
    node->link = createNode(newData); 

    nodeData = (int*)node->dataPtr; 
    printf ("Data from node 1: %d\n", *nodeData); 

    nodeData = (int*)node->link->dataPtr; 
    printf ("Data from node 2: %d\n", *nodeData); 
    return 0; 
}  //main 

Что толк «ЬурейиЙ» в этой ситуации? (если предположить, что здесь я снова использовал NODE. -> если это предположение неверно, скажите, пожалуйста, почему. Я не знаком с языком С.)

+1

typedef определяет новый тип, который вы можете использовать для нескольких экземпляров. Вы пытались найти другие ответы на этот вопрос здесь? – Dronz

+1

Строка 'struct * link;' не компилируется. Ни версия 2, ни версия 3 не работают, потому что ни одна из них не компилируется. – user3386109

ответ

0

typedef Используется для обозначения нового типа. Когда используется ваша третья версия struct, она просто объявляет NODE типа struct{ void* dataPtr; struct* link;}. Теперь, что бы вы сделали, если вам нужно объявить другую переменную того же типа, что и для NODE? Существует только один вариант, вы должны объявить его вместе с NODE, иначе они несовместимы.
Две структуры совместимы, если они объявлены в одно и то же время или если они объявлены с использованием тега структуры или того же типа (с использованием typedef).

3

Следующий код не не создает тип. Он создает объект с именем NODE, который имеет анонимную структуру, как тип.

struct { 
    void* dataPtr; 
    void* link; 
} NODE; 

int main() { 
} 

Мне трудно поверить, что код в вашем запросе компилируется.