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

sim*_*mar 17 c structure extern

我正在尝试在C中实现树算法.我在头文件中声明了一个完全独立的外部结构(b_tree_ds.h).现在我打算在所有想要使用这个结构的源文件中导入该文件.所以我必须在头文件中使用extern声明它.

现在问题是我想要定义它的typedef.编译器给出了多个存储类的错误.我该怎么做

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;
Run Code Online (Sandbox Code Playgroud)

实际问题如下,我仍然无法解决??? 我最近学会了如何使用带头文件的多个源文件来使代码可移植和分层.为了做到这一点,我厌倦了使用这个主体创建我的树程序.这是我的文件

b_tree_ds.h - 这将包含树节点的数据结构声明,可以调用实现树的不同功能的各种函数(可以在不同的源文件中)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;
Run Code Online (Sandbox Code Playgroud)

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

这是我的其他源文件

traverse.h - 包含遍历函数的声明

void traverse_print (NODE* p);
Run Code Online (Sandbox Code Playgroud)

这里我也得到了未知标识符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);
}
Run Code Online (Sandbox Code Playgroud)

最后是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 27

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

// header file 'node.h'

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

extern node root_node;
Run Code Online (Sandbox Code Playgroud)

然后在某处提供实现:

// source file

#include <node.h>

node root_node;
Run Code Online (Sandbox Code Playgroud)

  • *只有对象*: - ?所以你也包括那里的功能? (2认同)
  • C中的对象是什么? (2认同)
  • @Pithikos:具有存储空间且可以作为值的事物。例如一个`int`。 (2认同)

cni*_*tar 25

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

编辑SquareRootOfTwentyThree

我用以下方式使用这些热量:

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

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

所以"定义"正是我的意思.

  • 通常,定义意味着存储的分配,通常不应该在标题中发生(无论它是否被保护).在标题中,您可以进行声明.因此你的答案令人困惑.请参考C标准,而不是网上的一些解释. (2认同)