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 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:
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".
#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.
Benutzer877329
Ich würde vorschlagen, dass Sie Linus folgen[1]und verwenden Sie keine Typedef-Struktur.
keine Forward-Deklaration hier..
– Karoly Horvath
31. August 2011 um 15:19 Uhr
Beachten Sie das, wenn Sie Zeiger auf verwenden
struct
sehr viel, finden Sie die->
Betreiber sehr nützlich.(*p).currentFile
kann geschrieben werden alsp->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