Wie man typedef’d struct in .h weiterleitet

Lesezeit: 5 Minuten

Ich habe Preprocessor.h

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

Da wurde mir klar, dass ich Deklarationen von Definitionen trennen musste. Also habe ich Preprocessor.c erstellt:

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

Und Preprocessor.h ist jetzt:

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

Das funktioniert offensichtlich nicht, weil Pr..h den Prepro-Typ nicht kennt. Ich habe schon mehrere Kombinationen ausprobiert, keine davon hat funktioniert. Ich kann die Lösung nicht finden.

  • keine Forward-Deklaration hier..

    – Karoly Horvath

    31. August 2011 um 15:19 Uhr

  • Beachten Sie das, wenn Sie Zeiger auf verwenden structsehr viel, finden Sie die -> Betreiber sehr nützlich. (*p).currentFile kann geschrieben werden als p->currentFile.

    – Chris Lutz

    31. August 2011 um 15:26 Uhr

  • Dies ist C. Ich bin mir fast sicher, dass Sie das in C nicht tun können.

    – Guido Tarsia

    31. August 2011 um 15:38 Uhr

  • @Erandros Nein, die -> -Operator ist sowohl in C als auch in C++ sehr gültig

    – Prätorianer

    31. August 2011 um 17:07 Uhr


  • Du hast recht, -> gilt in C.

    – Guido Tarsia

    31. August 2011 um 18:24 Uhr

Beweg den typedef struct Preprocessor Prepro; zum Header die Datei und die Definition in der c-Datei zusammen mit der Prepro_init-Definition. Dies wird es ohne Probleme für Sie weiterleiten.

Präprozessor.h

#ifndef _PREPROCESSOR_H_
#define _PREPROCESSOR_H_

#define MAX_FILES 15

typedef struct Preprocessor Prepro;

void Prepro_init(Prepro* p);

#endif

Präprozessor.c

#include "Preprocessor.h"

#include <stdio.h>

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

  • Präprozessor ist vielleicht eine schlechte Namenswahl, aber das liegt an Ihnen 🙂 Auch FILE wird oft mit einem Zeiger referenziert, FILE *

    – Jo

    31. August 2011 um 15:25 Uhr


  • Ich würde die eigentliche setzen struct -Definition in einem anderen Header, sodass Sie Ihre Implementierung auch in verschiedene Quelldateien aufteilen können. Das würde es einfacher machen, die gewünschte Funktion zu erhalten.

    – Chris Lutz

    31. August 2011 um 15:28 Uhr

  • @Chris Lutz: Vielleicht möchte er, dass es ein undurchsichtiger Typ ist

    – Prätorianer

    31. August 2011 um 15:30 Uhr

  • OK für .h-Datei, aber jetzt weiß die c-Datei nicht, was Prepro ist.

    – Guido Tarsia

    31. August 2011 um 15:37 Uhr

  • @Erandros: So wie es hier eingerichtet ist, kannst du nicht darauf zugreifen currentFile Member (oder irgendein Member für diese Angelegenheit) außerhalb der Preprocessor.c-Datei. Wenn Sie dazu in der Lage sein müssen, müssen Sie die Definition für angeben struct Preprocessor in der Header-Datei und fügen Sie die Header-Datei dort ein, wo Sie sie verwenden möchten.

    – Sander DeDycker

    31. August 2011 um 15:59 Uhr

Wenn Sie die Definition von ausblenden möchten Preprocessorkönnen Sie dies einfach in die Header-Datei einfügen:

struct Preprocessor;
typedef struct Preprocessor Prepro;

Aber im Allgemeinen werden Sie wahrscheinlich auch die benötigen Preprocessor -Definition in der Header-Datei, damit anderer Code sie tatsächlich verwenden kann.

  • Die erste Zeile ist unnötig, da die zweite dies auch deklariert struct Preprocessor existiert, ohne sie zu definieren.

    – Chris Lutz

    31. August 2011 um 15:24 Uhr

  • @Chris: Ich weiß, dachte aber, es würde die Dinge klarer machen, indem die Vorwärtsdeklaration explizit angezeigt wird.

    – Sander DeDycker

    31. August 2011 um 15:31 Uhr

  • Sie sollten auch erwähnen, dass die einzigen möglichen Verwendungen des Prepro-Typs Durchgangszeiger sind. Die Definition des Typs geht dann in die .c-Datei und die Implementierung ist die einzige, die die Interna von Prepro kennt.

    – bin so

    1. September 2011 um 8:27 Uhr

  • Gute Antwort. Das Bit “aber allgemeiner gesagt, Sie werden wahrscheinlich auch die Definition in der Header-Datei benötigen” ist etwas übertrieben … Oft brauchen Sie in einem Header nur einen Zeiger auf die Struktur, in diesem Fall Ihre 2-Zeilen-Lösung (oder sogar die 1-zeilige Variante von Chris) funktioniert hervorragend.

    – persönliche_cloud

    22. August 2020 um 19:16 Uhr


Sie haben eingegeben .c was drin sein soll .hund umgekehrt. Prepro_init muss drin sein .c Datei, und diese Datei muss #include "Preprocessor.h".

Benutzer-Avatar
Muthu Ganapathy Nathan

YAS:Noch eine andere Lösung.

Präprozessor.h

<some code>
    void Prepro_init(Prepro* p) {
        (*p).currentFile = 0;
    }
<some code>

Präprozessor.c

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};
typedef struct Preprocessor Prepro;

#include "Preprocessor.h"      //include after defining your structure.

         <some code> 
        {
              struct Prepro p;
              Prepro_init(p);
     <some code> 
          .... using p.currentFile.....
          .....using other members....
     <some code> 
        }
           <some code> 

Jetzt wird es funktionieren. Ich denke, das ist Ihre Anforderung. Ich hoffe es hilft.

Nachteil:
Die Mitglieder der Struktur Präprozessor müssen vorbestimmt werden. dh die Header-Datei verwendet das Member currentFile. Daher muss eine c-Datei, die Preprocessor.h enthält, eine Struktur haben, die als Prepro typdefiniert ist, und diese Struktur muss ein Mitglied currentFile enthalten. (in diesem Fall).

Das gleiche Problem hatte ich ein Jahr zuvor, als ich eine Header-Datei schrieb, um einen Avl-Baum eines Benutzers in einem grafischen Baumformat anzuzeigen.

Benutzer-Avatar
Benutzer877329

Ich würde vorschlagen, dass Sie Linus folgen[1]und verwenden Sie keine Typedef-Struktur.

Wenn Sie die Kontrolle über die Bibliothek haben:

Datei einschließen

struct Foo;

int foo_get_n(const struct Foo *bar);

In der Implementierungsdatei

struct Foo
{int n;};

int foo_get_n(const struct Foo *bar)
{return bar->n;}

Wenn Sie keine Kontrolle über die Bibliothek haben:

Bitten Sie den Betreuer, diese verschmutzenden Typedefs aus den Include-Dateien zu entfernen.

Zusammenfassung

Verwenden Sie keine typedef-Struktur.

[1] http://yarchive.net/comp/linux/typedefs.html

Benutzer-Avatar
Flexo

Tausch .h und .c Datei. Header einfügen .c.

Lesen Sie auch ein Buch über Deklarationen, Definitionen und was Header-Dateien tun.

1373720cookie-checkWie man typedef’d struct in .h weiterleitet

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

Privacy policy