[C/VC++] compile en include volgorde

Pagina: 1
Acties:

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
Als ik een project compileer dan valt mij op dat de Compiler altijd begint met dezelfde file en ook vanaf hier de #includes afwerkt. Als ie alles heeft gehad, kijkt ie of er nog files fijn die ie niet gehad heeft. (tenminste, voor zover ik het snap).

Hoe bepaalt de compiler welke file ie mee begint en kan je dit zelf aanpassen?

Al mijn files heb ik beveiligd met een
code:
1
2
3
4
#ifndef PDUR
#define PDUR
REST VAN DE FILE
#endif

constructie.
Maar als ik ergens een #error in opneem dan komt deze steeds 2maal voorbij.
code:
1
2
3
4
5
6
Compiling...
PduR.c
c:\Documents and Settings\deckerr\Desktop\AUTOSAR\Demo Application\circulatbufferinit\PduR_FrIf.h(31) : fatal error C1189: #error :  "include PDUR.h"
circular.cpp
c:\Documents and Settings\deckerr\Desktop\AUTOSAR\Demo Application\circulatbufferinit\PduR_FrIf.h(31) : fatal error C1189: #error :  "include PDUR.h"
Generating Code...


Hoe kan dat?
mijn constructie moet topch beveiligen dat een file niet 2 maal word mee genomen?

[ Voor 6% gewijzigd door liquid_ice op 24-04-2007 11:13 ]

Klus page: http://klusthuis.blogspot.com


  • Icelus
  • Registratie: Januari 2004
  • Niet online
liquid_ice schreef op dinsdag 24 april 2007 @ 11:10:
Als ik een project compileer dan valt mij op dat de Compiler altijd begint met dezelfde file en ook vanaf hier de #includes afwerkt. Als ie alles heeft gehad, kijkt ie of er nog files fijn die ie niet gehad heeft. (tenminste, voor zover ik het snap).

Hoe bepaalt de compiler welke file ie mee begint en kan je dit zelf aanpassen?
Er is geen vaste volgorde. De compiler compileert alle .c(pp) bestanden en zal de gegenereerde code aan het eind samenvoegen (linken).
Maar als ik ergens een #error in opneem dan komt deze steeds 2maal voorbij.
Dat komt omdat de compiler ieder .c(pp)-bestand apart compileert en iedere keer de .h bestanden zal doornemen. (In jouw voorbeeld PduR.c en circular.cpp)

Developer Accused Of Unreadable Code Refuses To Comment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 07:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet #include directives letterlijk zien als commando's om de inhoud van de file die je include te copy/pasten op de plek waar de #include directive staat. De meeste compilers hebben ook een optie om alleen te preprocessen (of daar is een andere executable voor). Als je dat doet dan krijg je een file zonder includes waarin alle geinclude files ook staan verwerkt. Als je die doorkijkt dan snap je ook waarom je je #error meerdere keren krijgt - hij staat in elke sourcefile die die header geinclude heeft.

Daarom is het ook belangrijk dat headers geen functie-implementaties (inline functies zijn hier een uitzondering op) of variabel-definities bevatten. De include files zijn er alleen voor de compiler om te zeggen "er bestaat een X", zodat je die X in je code kunt gebruiken. In een andere sourcefile zeg je weer "hier is de X waar ik het eerder over had". De linker linkt al die stukjes code bij elkaar in een enkele executable.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zie hierboven...

Als je je nog afvraagt waarom die beveiliging zoveel gebruikt wordt: Het is om dubbele declaraties tegen te gaan:
C: x.h
1
typedef int x;

C: y.h
1
2
#include "x.h"
x convertToX(int);

C: prog.c
1
2
3
4
5
6
7
#include "x.h"
#include "y.h"

int main() {
  x var;
  var = convertToX(5);
}


Bovenstaande code geeft een fout dat lijkt op: Error x.h 1: Redeclaration of 'x'

Dat is dus op te lossen door:
C: x.h
1
2
3
4
#ifndef X_H
#define X_H
typedef int x;
#endif