Как сделать конструкцию 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 ответа:
Вы не можете создать структуру
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;