Как сделать конструкцию extern и определить его тип


Я пытаюсь реализовать древовидные алгоритмы в C. я объявил структуру extern в заголовочном файле, который полностью независим (b_tree_ds.ч). Теперь я планирую импортировать файл во все исходные файлы, которые хотят использовать эту структуру. Поэтому я должен объявить его, используя 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 дает ошибку множественного класса хранения, но если я ее пропущу, я получу ошибку для нескольких определений.

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

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

void traverse_print (NODE* p);

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

Траверс.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);
}

Наконец главная.c

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

void main()
{
    // input
    NODE p;

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

    printf("nnThe 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 ("nnIn 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 ("nnIn 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 13

3 ответа:

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

Редактировать для SquareRootOfTwentyThree

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

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

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

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

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

// header file 'node.h'

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

extern node root_node;

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

// source file

#include <node.h>

node root_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 */  

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

NODE* newNode = NULL;