mehrere Dateien einbinden

centhron69

Grünschnabel
Hihi,

ich suche vergeblich nach einer Antwort wie man "richtig" mehrere Headerdateien in C einbindet ohne zu doppeln.

Hier ein Beispiel:

Im unteren Programm fehlt #include<stdio.h>. Aber in welche Datei füg ich sie ein (main.c, io.c oder io.h)? Muss ich in io.c _und_ main.c den include machen? Ist es falsch wenn ich stdio.h mehrmahls include?

Bis heute hab ich Gedacht, dass Include die komplette Datei sozusagen in die main schreibt beim compilieren.

main.c
Code:
#include"io.h"	//Input Output

int main(void)
{
	const char *COM_IN_NAME = "/dev/cua00";		//input COM name
	const char *COM_OUT_NAME = "/dev/cua01";	//output COM name

	char str[100];		//Read-Write String	

	readCom(COM_IN_NAME, str); 
	writeCom(COM_OUT_NAME, str);

	return 0;
}

io.h
Code:
#ifndef IO_H
#define IO_H

#ifndef STDIO_H
#error STDIO_H fehlt
#endif

int readCom(const char *COM_IN_NAME, char* str);

int writeCom(const char *COM_OUT_NAME, char* str);

#endif

io.c

Code:
int readCom(const char *COM_IN_NAME, char *str)
{
	//input filestream oeffnen
	FILE *com_in;
	com_in = fopen(COM_IN_NAME, "rb");
	if(com_in == NULL)	
	{
		printf("%s konnte nicht geoeffnet werden\n", COM_IN_NAME);
		return 1;
	}
	
	//lesen bis <ENTER> oder max-groeße erreicht
	fgets(str, 100, com_in);

	fclose(com_in);
	return 0;
}

int writeCom(const char *COM_OUT_NAME, char *str)
{
	//output filestream oeffnen
	FILE* com_out;
	com_out = fopen(COM_OUT_NAME, "wb");
	if(com_out == NULL)
	{
		printf("%s konnte nicht geoffnet werden\n", COM_OUT_NAME);
		return 1;
	}
	
	fputs(str, com_out);

	return 0;		
}
 
Du bindest dort eine Headerdatei ein, wo du ihre Deklarationen benötigst.

In deinem Fall brauchst du die stdio.h nur in io.c!
 
Code:
Du bindest dort eine Headerdatei ein, wo du ihre Deklarationen benötigst.

In deinem Fall brauchst du die stdio.h nur in io.c!

Das heißt wenn ich jetzt 20 Header hätte in denen ich die stdio.h brauche, muss ich in jedem dieser Header stdio.h includen?
 
Hi

Ist es falsch wenn ich stdio.h mehrmahls include?
Nicht falsch.
Wenns lustig ist kann man auch in einer einzigen Datei hundert stdio´s includen.

Bis heute hab ich Gedacht, dass Include die komplette Datei sozusagen in die main schreibt beim compilieren.
Das stimmt.

Aber so ein Konstrukt wie in deiner io.h:
C++:
#ifndef IO_H
#define IO_H

#endif
haben die vorgefertigten Header auch.
Dadurch wird bei Mehrfacheinbindung verhindert,
dass der tatsächliche Inhalt mehrfach verarbeitet wird.
Beim ersten Mal: Kein IO_H definiert, also definieren und alles andere auch machen.
Beim nächsten Mal: Aha, schon definiert, also den ganzen Block überspringen.

Dadurch dauert die Verarbeitung im Compiler zwar etwas länger (Bereich Mikro/Millisekunden),
aber jedenfalls besser als jedesmal für jedes Include zu überlegen wo es hinmuss.
Einfach in jede Datei, die es braucht; damit macht man es sich selbst viel einfacher.

io.h
Code:
#ifndef IO_H
#define IO_H

#ifndef STDIO_H
#error STDIO_H fehlt
#endif

int readCom(const char *COM_IN_NAME, char* str);

int writeCom(const char *COM_OUT_NAME, char* str);

#endif
Weg mit
C++:
#ifndef STDIO_H
#error STDIO_H fehlt
#endif
Das gehört zu "unnötig verkomplizieren"

Das heißt wenn ich jetzt 20 Header hätte in denen ich die stdio.h brauche, muss ich in jedem dieser Header stdio.h includen?
Ja.
 
Zurück