如何构造extern结构并定义其typedef

问题描述 投票:15回答:3

我正在尝试在C中实现树算法。我在头文件中声明了一个完全独立的外部结构(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;

当我尝试在typedef extern struct node中添加extern时,它会给出多个存储类的错误,但如果我错过它,我会得到多个定义的错误。

这是我的其他源文件

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);
    }
}

这是我第一次尝试这种做法,请建议我的程序结构良好,还是我应该尝试别的。

c extern structure
3个回答
25
投票

你不能制作一个结构extern。只需在include-guard保护的头文件中定义它,并在您需要的任何地方包含该头文件。

EDIT for SquareRootOfTwentyThree

我在the following way中使用那些热量:

结构类型定义描述作为结构一部分的成员。它包含struct关键字,后跟可选标识符(结构标记)和括号括起的成员列表。

结构声明与结构定义具有相同的形式,除了声明没有括号括起的成员列表。

所以“定义”正是我的意思。


28
投票

在C中,结构没有链接,只有对象和函数。所以你可以这样写:

// header file 'node.h'

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

extern node root_node;

然后在某处提供实现:

// source file

#include <node.h>

node root_node;

2
投票

在你的头文件中声明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;
© www.soinside.com 2019 - 2024. All rights reserved.