Как создать структуру extern и определить ее typedef
Я пытаюсь реализовать алгоритмы дерева в 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 - Это будет содержать объявление структуры данных дерева node дерева, которое можно вызвать для различных функций, реализующих разные функциональные возможности дерева (которые могут быть в разных исходных файлах)
typedef struct node {
struct node* left;
struct node* right;
int key; // contains value
}NODE;
Когда я пытаюсь добавить extern, как в typedef extern struct node
, он дает ошибку для нескольких классов хранения, но если я его пропущу, я получаю ошибку для нескольких определений.
Вот мои другие исходные файлы
traverse.h - содержит объявление функции перемещения
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);
}
}
Это моя первая попытка такой практики, пожалуйста, предложите, чтобы структурирование моей программы было хорошим или я должен попробовать что-то еще.
Ответы
Ответ 1
Вы не можете создать struct extern
. Просто определите его в защищенном заголовке include-guard и включите этот заголовок везде, где он вам нужен.
EDIT для SquareRootOfTwentyThree
Я использую те термины в следующим образом:
Определение типа структуры описывает элементы, которые являются частью состав. Он содержит ключевое слово struct, за которым следует необязательный идентификатор (тег структуры) и список элементов, заключенный в фигурные скобки.
Объявление структуры имеет ту же форму, что и определение структуры кроме объявления не содержит список элементов, заключенных в фигурные скобки.
Итак, "определение" - это именно то, что я имел в виду.
Ответ 2
В C структуры не имеют привязки, только объекты и функции. Поэтому вы можете написать это:
// header file 'node.h'
typedef struct node_
{
/* ... */
} node;
extern node root_node;
Затем выполните реализацию где-нибудь:
// source file
#include <node.h>
node root_node;
Ответ 3
В вашем файле заголовка объявите 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;