Ich möchte etwas tun, das unmöglich scheint.Ist es möglich, einen Teil eines Standard-Headers (in C) zu verstecken?
Ich möchte 3 Dateien schreiben: main.c, foo.h, foo.c.
Die Idee ist, eine Struktur in foo.h oder foo.c so zu definieren, dass seine Mitglieder in main.c sichtbar sind. Eines der Strukturelemente hat den Typ FILE
, wie im Standardkopf <stdio.h>
definiert. Aber die Funktionen und Makros von <stdio.h>
müssen in der Datei main.c nicht sichtbar bleiben.
Die Lösung müsste dem Standard C (C99 und/oder C11) entsprechen und portabel sein. Ist das möglich?
Der Header foo.h wird in beiden, main.c und foo.c #include.
Der Standard-Header <stdio.h>
ist # nur in foo.c enthalten, aber nicht in main.c.
Ich möchte ein struct
erklären, wie folgt:
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
Für das, was folgt, nur das Mitglied FILE *F
wichtig ist.
Die Struktur myfile
wird durch Funktionen initialisiert und geändert, die in foo.c erscheinen.
Die Absicht ist, Dateioperationen auf myfile
durch extern
Funktionen in foo.h erklärt zu tun, was wiederum in foo.c definiert werden.
Die Dateioperationen beinhalten Standardfunktionen von <stdio.h>
, aber diese Funktionen müssen in der Datei main.c versteckt werden. Allerdings möchte ich direkt von main.c auf die Mitglieder von myfile
zugreifen. Dies würde bedeuten, dass die Definition von struct myfile_s
in foo.h getan werden muss (das heißt, es kann nicht mit dem Trick der Verwendung unvollständiger struct-Deklarationen wie struct myfile_s ;
"verzögert" werden).
Kurz gesagt, ich möchte, dass die Art FILE
und/oder foo.h, aber der Rest von <stdio.h>
Erklärungen in main.c sichtbar sein immer für sie versteckt.
Eine weitere Einschränkung: die Idee, die Definition von FILE
von <stdio.h>
"zur Hand" direkt zu kopieren, wäre nicht wünschenswert, weil der Code portabel sein müsste.
Mein erster Versuch war die struct myfile
Hidding durch Schreiben in foo.c.
Der Code war:
foo.h
struct myfile_s;
struct myfile_s myfile;
extern void startfile(struct myfile *f);
foo.c
#include <stdio.h>
#include "foo.h"
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
void startfile(struct myfile *f)
{
// Do some stuff...
}
main.c
#include "foo.h"
int main(void)
{
myfile.F = NULL; // This kind of access bring error, but I want to do it anyway!!
startfile(&myfile);
return 0;
}
Die verzögerte struct myfile_s
Erklärung vermeidet die Notwendigkeit <stdio.h>
in foo.h, enthält, so dass der Kopf funktioniert gut, aber der Strukturtyp bleibt unvollständig, so dass der Zugang zu myfile.F
nicht in main.c erfolgen.
So: Wie kann ich auf myfile.F zugreifen?
habe ich versucht, eine andere Art und Weise, dass, natürlich, Fehler gibt zu:
foo.h
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
extern void startfile(struct myfile *f);
foo.c
#include <stdio.h>
#include "foo.h"
void startfile(struct myfile *f)
{
// Do some stuff...
}
wäre es nicht genug mit zwei verschiedenen Headern zu arbeiten? eine interne Headerdatei und eine externe? Das externe Element kennt nur den void pointer (oder in Ihrem Fall den FILE pointer Teil der Struktur) und intern wertet man diese void pointer auf die Typen aus, so dass derjenige mit der internen headerdatei die Teile kennt, die intern bleiben sollen und die externe header jsut zeigt was du ausgeben willst. – dhein
Haben Sie versucht, einschließlich '' in 'foo.h', d. H. Wo Sie Ihre Struktur definieren ... Ich bevorzuge, es in der Kopfzeile zu deklarieren –
Was nicht mit dem zweiten Ansatz funktioniert? Es sieht meistens auf dem richtigen Weg aus. –