Как сделать структуру extern и определить ее typedef - PullRequest
16 голосов
/ 17 марта 2012

Я пытаюсь реализовать древовидные алгоритмы на C. Я объявил структуру extern в заголовочном файле, которая является полностью независимой (b_tree_ds.h).Теперь я планирую импортировать файл во все исходные файлы, которые хотят использовать эту структуру.Поэтому я должен объявить его, используя extern в заголовке.

Теперь проблема в том, что я хочу также определить его typedef.компилятор выдает ошибку нескольких классов хранения.Как мне это сделать.

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Реальная проблема заключается в следующем, что я до сих пор не могу решить ???Недавно я узнал, как мы можем использовать несколько исходных файлов с заголовочными файлами, чтобы сделать код переносимым и иерархическим.Для этого мне надоело создавать свою древовидную программу с использованием этого принципала.Вот мои файлы

b_tree_ds.h - это будет содержать объявление структуры данных узла дерева, которое можно вызывать для различных функций, реализующих различные функции дерева (которые могут бытьв разных исходных файлах)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Когда я пытаюсь добавить extern, как в typedef extern struct node, выдает ошибку нескольких классов хранения, но если я ее пропускаю, я получаю ошибку для нескольких определений.

Вот мои другие исходные файлы

traverse.h - содержит объявление функции traverse

void traverse_print (NODE* p);

Здесь также я получаю ошибку для неизвестного идентификатора NODE

traverse.c - содержит определение этой функции

#include <stdio.h>
#include "b_tree_ds.h"
#include "traverse.h"

void traverse_print(NODE* p)
{
    if(p->left != NULL)
    {
        traverse_print(p->left);
    }

    if (p->right != NULL)
    {
        traverse_print(p->right);
    }

    printf ("\n%d",p->key);
}

Наконец, main.c

#include <stdio.h>
#include "traverse.h"

void main()
{
    // input
    NODE p;

    printf("\nInput the tree");
    input_tree (&p);

    printf("\n\nThe tree is traversing ...\n")
    traverse_print(&p);
}

void input_tree (NODE *p)
{
    int in;
    int c;
    NODE *temp;

    printf("\n Enter the key value for p: ");
    scanf("%d", &in);
    p->key  =in;
    printf ("\n\nIn relation to node with value %d",in);
    printf ("Does it have left child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
    printf ("\n\nIn relation to node with value %d",p->key);

    printf ("\nDoes it have right child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
}

Это моя первая попытка подобной практики, пожалуйста, предложите, является ли структурирование моей программы хорошим или я долженпопробуйте что-нибудь еще.

Ответы [ 3 ]

28 голосов
/ 17 марта 2012

В C структуры не имеют связи, только объекты и функции.Таким образом, вы можете написать это:

// header file 'node.h'

typedef struct node_
{
    /* ... */
} node;

extern node root_node;

Затем предоставьте реализацию где-нибудь:

// source file

#include <node.h>

node root_node;
25 голосов
/ 17 марта 2012

Вы не можете создать структуру extern.Просто определите его в защищенном заголовке include-guard и включайте этот заголовок везде, где вам это нужно.

РЕДАКТИРОВАТЬ для SquareRootOfTwentyThree

Я использую эти термины в следующим образом :

Определение типа структуры описывает элементы, которые являются частью структуры.Он содержит ключевое слово struct, за которым следует необязательный идентификатор (тег структуры) и список членов в скобках.

Объявление структуры имеет ту же форму, что и определение структуры, за исключением того, что объявление не имеет скобки.Прилагаемый список членов.

Так что «определение» - это именно то, что я имел в виду.

2 голосов
/ 17 марта 2012

В вашем заголовочном файле объявите node.h как этот

#ifndef NODE_H
#define NODE_H

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct node {
        struct node* left;
        struct node* right;
        int key;    // contains value
    }NODE;


#ifdef  __cplusplus
}
#endif

#endif  /* NODE_H */  

Вы можете включить этот заголовочный файл в любую программу на c и использовать его как

NODE* newNode = NULL;
...