Wie man eine Struktur extern macht und ihre Typedef definiert

Lesezeit: 5 Minuten

Benutzer-Avatar
simar

Ich versuche, Baumalgorithmen in C zu implementieren. Ich habe eine externe Struktur in einer Header-Datei deklariert, die völlig unabhängig ist (b_tree_ds.h). Jetzt plane ich, die Datei in alle Quelldateien zu importieren, die diese Struktur verwenden möchten. Also muss ich es mit extern im Header deklarieren.

Jetzt ist das Problem, dass ich auch seine Typedef definieren möchte. Der Compiler gibt einen Fehler mehrerer Speicherklassen aus. Wie soll ich das machen.

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Das eigentliche Problem ist folgendes, das ich immer noch nicht beheben kann??? Ich habe kürzlich gelernt, wie wir mehrere Quelldateien mit Header-Dateien verwenden können, um Code portabel und hierarchisch zu machen. Um dies zu tun, habe ich es satt, mein Baumprogramm mit diesem Prinzip zu erstellen. Hier sind meine Dateien

b_tree_ds.h – Dies enthält a Erklärung der Datenstruktur des Knotens eines Baums, der für verschiedene Funktionen aufgerufen werden kann, die unterschiedliche Funktionen des Baums implementieren (die sich in verschiedenen Quelldateien befinden können)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Wenn ich versuche, ein externes wie in typedef hinzuzufügen extern struct node Es gibt einen Fehler mehrerer Speicherklassen, aber wenn ich ihn verpasse, erhalte ich einen Fehler für mehrere Definitionen.

Hier sind meine anderen Quelldateien

traverse.h – enthält die Deklaration der Traverse-Funktion

void traverse_print (NODE* p);

Auch hier bekomme ich einen Fehler für den unbekannten Bezeichner NODE

traverse.c – enthält die Definition dieser Funktion

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

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

Dies ist mein erster Versuch einer solchen Praxis. Bitte schlagen Sie vor, ob die Strukturierung meines Programms gut ist oder ob ich etwas anderes versuchen sollte.

Benutzer-Avatar
Cnicutar

Sie können keine Struktur erstellen extern. Definieren Sie es einfach in einem durch Include-Guard geschützten Header und fügen Sie diesen Header überall dort ein, wo Sie ihn benötigen.

BEARBEITEN für SquareRootOfTwentyThree

Ich benutze diese Thermen in folgenden Weg:

Eine Strukturtypdefinition beschreibt die Mitglieder, die Teil der Struktur sind. Es enthält das Schlüsselwort struct gefolgt von einem optionalen Bezeichner (dem Struktur-Tag) und einer in geschweiften Klammern eingeschlossenen Liste von Elementen.

Eine Strukturdeklaration hat die gleiche Form wie eine Strukturdefinition, außer dass die Deklaration keine in geschweiften Klammern eingeschlossene Liste von Mitgliedern hat.

Also “Definition” ist genau das, was ich meinte.

  • Im Allgemeinen impliziert die Definition die Zuweisung von Speicher, was normalerweise nicht in einem Header passieren sollte (egal, ob er geschützt ist). In Kopfzeilen machen Sie Deklarationen. Ihre Antwort ist daher verwirrend. Bitte argumentieren Sie mit Verweisen auf die C-Normen, nicht auf irgendeine Interpretation, die Sie im Internet finden.

    – SquareRootOfTwentyThree

    17. März 2012 um 15:02 Uhr

  • @SquareRootOfTwentyThree Ich denke, du piekst pingelig. Ich bleibe bei meiner Antwort: “definieren” ist in diesem Zusammenhang glasklar, man kann es mit nichts anderem verwechseln.

    – Cnicutar

    17. März 2012 um 15:15 Uhr


  • Es ist nicht klar. Sie sagen wörtlich, dass der Benutzer sollte definieren die Struktur im Header. Ändern Sie es einfach in erklären und es ist gut..

    – Menge

    16. Oktober 2014 um 21:08 Uhr

  • Können Sie eine Struktur nicht extern extern machen, wie Sie eine Variable extern (mit geringfügigen Änderungen)? Erstellen Sie einen Header extern.h, der extern Sruct1 S enthält, erstellen Sie einen weiteren Header struct.h, der die Typedef-Struktur Sruct1 enthält, und deklarieren Sie schließlich die Struktur Sruct1 S in einer beliebigen einzelnen .c-Datei. Fügen Sie Header extern.h & struct.h in alle Dateien ein, in denen diese Struktur verwendet werden muss. Auf diese Struktur kann jetzt überall zugegriffen werden

    – AlphaGoku

    7. April 2016 um 6:48 Uhr

  • Ich stelle es mir so vor: Deklaration spezifiziert Bezeichner. Die Definition gibt das Layout an. Die Instanziierung impliziert die Zuweisung von Speicher. In einer Definition wird kein Speicherplatz zugewiesen. Akzeptierte dies als Antwort.

    – Durchschnittstyp

    19. Oktober 2016 um 15:03 Uhr

Benutzer-Avatar
Kerrek SB

In C haben Strukturen keine Verknüpfung, nur Objekte und Funktionen. Sie können also Folgendes schreiben:

// header file 'node.h'

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

extern node root_node;

Stellen Sie dann irgendwo eine Implementierung bereit:

// source file

#include <node.h>

node root_node;

  • Nur Objekte tun es 😕 Sie integrieren dort also auch Funktionen?

    – Cnicutar

    17. März 2012 um 12:39 Uhr

  • @cnicutar: Ja, ich denke schon 🙂 Du kannst die Adresse einer Funktion nehmen, nicht?

    – Kerrek SB

    17. März 2012 um 12:46 Uhr


  • Nun, dann gibt es ein Problem, der Standard sagt irgendwo: Ein Bezeichner kann ein Objekt bezeichnen; eine Funktion; ein Tag oder ein Mitglied einer Struktur, Vereinigung oder Aufzählung; ein Typedef-Name; ein Markenname; ein Makroname; oder ein Makroparameter. Ich sehe also einen Unterschied zwischen Objekt und Funktion.

    – Cnicutar

    17. März 2012 um 12:53 Uhr


  • Was sind Objekte in C?

    – Pithikos

    16. Januar 2015 um 17:44 Uhr

  • @Pithikos: Dinge, die Speicher haben und die Werte sein können. Bsp. ein int.

    – Kerrek SB

    16. Januar 2015 um 21:33 Uhr


Benutzer-Avatar
Anantha Krishnan

Deklarieren Sie in Ihrer Header-Datei node.h so

#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 */  

Sie können diese Header-Datei in jedes C-Programm einbinden und wie verwenden

NODE* newNode = NULL;

  • Dies erzeugt einen Fehler Fehler: mehrere Speicherklassen in Deklarationsbezeichnern

    – simar

    17. März 2012 um 12:41 Uhr

  • extern "C" {} funktioniert nur, wenn Sie einen C++-Compiler verwenden.

    – Kaiser Katze

    22. August 2018 um 3:39 Uhr

1312150cookie-checkWie man eine Struktur extern macht und ihre Typedef definiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy