Re: Preprocessor: Einbinden von Header Dateien

Andre Heine <[email protected]>
Newsgroups gmane.linux.suse.programming
Organization none
Message-ID <[email protected]>
Am Freitag, 14. November 2008 20:59 schrieb Thomas Hertweck:
> > Meines erachtens ist hier die "Organisation" Deines Prokjektes/ Codes
> > nicht wirklich schön...
> >
> > *SCNR*
>
> Lies doch bitte die urspruenglichen Postings durch, bevor Du Mitten in
> eine Diskussion einsteigst, die Du offensichtlich nicht so ganz verfolgt
> hast oder verstehst, denn da wurde erwaehnt, 

Gegeben sind:

./include/first.h
./include/second.h
./src/main.c


"first.h" bindet "second.h" ein.

"main.c" bindet "first.h" ein.

Das steht so in Deinem ersten Post?!

Der Inhalt der beiden Header:

cat first.h:
----------------
#ifndef _FIRST_
#define _FIRST_

#include "second.h"

#endif

cat second.h:
----------------
#ifndef _SECOND_
#define _SECOND_

#define MAIN "werner"

#endif
----------------
cat main.c

#include <stdio.h>
#include "first.h"  // <> sollte AFAIK auch funktionieren

int main(void)
{
	printf("%s\n", MAIN);
	return 0;
}

##########

Alles kompiliert, keine Frage...

Jetzt kopiere ich die second.h in "src"...
(Warum auch immer, ist ja total egal:)

In dieser "loaken" kopie füge ich nun ein neuen Makro ein "NEWMAIN"
(Wird selbstverständlich in main.c benutzt...)

cat ./src/second.h
-----------------
#ifndef _MAIN_H_
#define _MAIN_H_

#define MAIN "newwerner"
#define NEWMAIN "newmainwerner"

#endif

Kompilieren tue ich in "src"

gcc -I. -I ../include main.c

main.c: In Funktion »main«:
main.c:9: error: `NEWMAIN' undeclared (first use in this function)
main.c:9: error: (Each undeclared identifier is reported only once
main.c:9: error: for each function it appears in.)

Bringt keinen Erfolg. Warum nur?

---------
#include "first.h"
// DANN
#include "second.h"

IMHO wird nun zuerst die "first.h" eingelesen, diese liest 
jetzt "IHRE" "second.h"...(in include)

Mein "lokaler" include wird so ignoriert, weil ja "include guards" drin 
stehen?

_SECOND_H existiert ja schon....

Was passiert, wenn Du in der "main.c" zuerst die "second.h" inkludierst
und erst anschliessend die "first.h"?

Richtig!

Die lokale wird eingelesen und überschreibt die in "first.h"...

Jetzt klappt "gcc -I. -I../include" wieder... "-I." könnte man sich auch 
sparen...

Nur so ein kleiner Gedanke...

Ohne genau zu wissen, was __genau__ in Deinen Dateien steht. Kann das 
natürlich alles obige hinfällig werden...

> wann solch eine Situation 
> Aenderungen einzupflegen. Daher stellt sich durchaus die Frage, wie sich
> ein Praeprozessor korrekt verhalten sollte beim Einbinden der Header.
> Zur Beantwortung dieser Frage hast Du ja leider nicht all zu viel
> beigetragen. Natuerlich haben alle Header include Guards etc., es geht
> hier nicht um Fehler von Programmieranfaengern, sondern um ein Problem,
> das mitunter in der Praxis auftritt.

So so... Programmieranfaenger?!

Da spricht der Doktor :-\


> Gruesse,
> Thomas

Andre
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.