Forum: Mikrocontroller und Digitale Elektronik #inlclude #ifdef ein Modul, individuelle Konfiguration?


von AVRli .. (avrli)


Lesenswert?

Hallo,

ich haben ein Programmteil den ich in mehreren Programmen verwenden 
möchte.
Dieser ist in...
1
/* tools.h */
2
#ifndef _tool_h_
3
#define _tool_h_
4
5
#ifndef _tools_conf_
6
# warning "tool.h default configuration..."
7
  #define _STORED_FAR    1
8
  #define _ALIGINMENT    1
9
#endif
10
11
void mytools_function();
12
13
#endif

...und...
1
/* tools.c */
2
#include "tools.h"
3
void mytools_function()
4
{
5
#if (_ALIGINMENT == 1)
6
  /* do something only when _ALIGMENT == 1 
7
  ...
8
  ...
9
  ...
10
  */
11
#end
12
}

...deklariert.

Diese beiden Dateien liegen nun in einem Ordner der meinen Projekten 
bekannt ist.

Die Projekte liegen wiederum in separate Ordner und ich möchte nun die 
"Schalter" (_STORED_FAR und _ALIGMENT) aus dem jeweiligen Projekt 
individuell steuern. Das versuche ich mit einer, im jeweiligem 
Projektordner befindlichen, tools_conf.h die nun so aussieht...
1
#ifndef _tools_conf_
2
#define _tools_conf_
3
4
  #define _STORED_FAR    0
5
  #define _ALIGINMENT  0
6
7
# warning "tools configuration for App_A loaded..."
8
#endif

Im main.c wird nun tools_cfg.h VOR tools.h definiert.

#include "tools_cfg.h"
#include <tools.h>

Doch leider erscheinen immer BEIDE Warnings (Ist auch noch nicht das 
richtige, Info oder Hinweis wäre nicht ganz so "erschreckend") in der 
Ausgabe und die "Default" Konfiguration wird leider nicht umgestellt. 
Beide Schalter bleiben 1.

Geht das überhaupt, was ich da vor habe oder wie macht man das? Denn ich 
will nicht bei jedem Projekt alles wieder neu konfigurieren müssen und 
tools soll "global" gepflegt werden.

Vielen Dank für jeden Tip!

Grüße AVRli...

von Wilhelm M. (wimalopaan)


Lesenswert?

AVRli .. schrieb:
> Diese beiden Dateien liegen nun in einem Ordner der meinen Projekten
> bekannt ist.

Wird tools.c auch kompiliert?

> Im main.c wird nun tools_cfg.h VOR tools.h definiert.
>
> #include "tools_cfg.h"
> #include <tools.h>
>
> Doch leider erscheinen immer BEIDE Warnings

Wenn Du main.c kompilierst oder tools.c?

von Dr. Sommer (Gast)


Lesenswert?

AVRli .. schrieb:
> tools_conf.h

AVRli .. schrieb:
> #include "tools_cfg.h"

Ist das nicht ein Widerspruch?

Woher soll die tools.c denn die tools_conf.h kennen? Die wird doch nur 
von der main.c eingebunden. Die tools.c sieht nur die tools.h und sonst 
nix.

AVRli .. schrieb:
> #define _STORED_FAR    1
> #define _ALIGINMENT    1
Nicht die Ursache deines Problems, aber Bezeichner die mit 
Unterstrich+Großbuchstabe, oder zwei Unterstrichen beginnen, sind in C 
und C++ der Standard-Bibliothek vorenthalten. Der Code darf also 
beliebig kaputt gehen.

AVRli .. schrieb:
> oder wie macht man das
Ich würde die Konfiguration lieber zur Laufzeit übergeben, oder per 
template-Parameter, oder per Referenz auf eine struct-Konstante o.ä. 
Diese Fummelei mit Makros ist recht unflexibel - insbesondere ist man 
pro Projekt auf nur genau eine Konfiguration festgelegt.

von Dirk B. (dirkb2)


Lesenswert?

AVRli .. schrieb:
> Im main.c wird nun tools_cfg.h VOR tools.h definiert.

Gibt es nur main.c oder auch ander *.c Dateien?

Definiere solche Dinge in den Projektoptionen als Compilerparameter.

von AVRli .. (avrli)


Lesenswert?

Danke für Deine Antwort...

Wilhelm M. schrieb:
> Wird tools.c auch kompiliert?

Ja, die Funktionen werden vom Main verwendet und da kommt keine Meldung 
das die "implict" sind oder sowas in der Richtung.
Da steht schon wirchtig was drin, das ist nur als Beispiel zu verstehen, 
wollte es nicht unnötig aufpusten.

Wilhelm M. schrieb:
> Wenn Du main.c kompilierst oder tools.c?

Ja das ist eine gute Frage, also ich compiliere immer nur die main.c und 
gehe nun davon aus das der Compiler die nötigen Abhänigkeiten selber 
"sieht". Es scheint aber so, als ob er die tools.h immer VOR der 
tools_conf.h berücksichtigt. :-(

Kann man das irgendwo genau ablesen?
Verwende Atmel Studio 7...

von Dirk B. (dirkb2)


Lesenswert?

AVRli .. schrieb:
> also ich compiliere immer nur die main.c und
> gehe nun davon aus das der Compiler die nötigen Abhänigkeiten selber
> "sieht".

Das macht kein C-Compiler.

von Wilhelm M. (wimalopaan)


Lesenswert?

AVRli .. schrieb:
> Danke für Deine Antwort...
>
> Wilhelm M. schrieb:
>> Wird tools.c auch kompiliert?
>
> Ja, die Funktionen werden vom Main verwendet und da kommt keine Meldung
> das die "implict" sind oder sowas in der Richtung.

Also tools.c soll als eigene TU hinzugebungen werden? Nun, da ist schon 
mal ein Fehler, weil tools.c mit eine Konfiguration, die tools_conf.h 
nicht verwendet, kompiliert wird.

> Da steht schon wirchtig was drin, das ist nur als Beispiel zu verstehen,
> wollte es nicht unnötig aufpusten.
>
> Wilhelm M. schrieb:
>> Wenn Du main.c kompilierst oder tools.c?
>
> Ja das ist eine gute Frage, also ich compiliere immer nur die main.c und
> gehe nun davon aus das der Compiler die nötigen Abhänigkeiten selber
> "sieht".

Der C-Compiler sieht gar nichts austomatisch (ist kein java). Da müsste 
man schauen, wie er aufgrufen wird.

> Es scheint aber so, als ob er die tools.h immer VOR der
> tools_conf.h berücksichtigt. :-(

Mir scheint, dass die eine Warnung aus der Compilation von tool.c kommt 
und die anderen von main.c

Hast Du ein makefile? Rufst Du den Compiler zu Fuß aus?

: Bearbeitet durch User
von AVRli .. (avrli)


Lesenswert?

Dr. Sommer schrieb:
> Woher soll die tools.c denn die tools_conf.h kennen? Die wird doch nur
> von der main.c eingebunden. Die tools.c sieht nur die tools.h und sonst
> nix.

Ich war der Annahme das dies durch...
1
#ifndef _tools_conf_
2
#endif
in der tools.h geschieht. Ist
1
_tools_conf_
 (durch Aufruf im main.c) definiert, den Block auslassen.

Dr. Sommer schrieb:
> Nicht die Ursache deines Problems, aber Bezeichner die

Danke für den Hinweis, ich werde es in was anderes ändern.
Wollte eine doppelte Belegung ausschließen.

Dirk B. schrieb:
> Gibt es nur main.c oder auch ander *.c Dateien?
> Definiere solche Dinge in den Projektoptionen als Compilerparameter.

In dem Beispiel nur ein main.c.
"Projektoptionen als Compilerparameter" muss ich suchen was Du damit 
meinst.

Wilhelm M. schrieb:
> Nun, da ist schon
> mal ein Fehler, weil tools.c mit eine Konfiguration, die tools_conf.h
> nicht verwendet, kompiliert wird.

Und deshalb
1
#def _tolls_conf_
 auch nicht kennt? Mist...

Wilhelm M. schrieb:
> Hast Du ein makefile? Rufst Du den Compiler zu Fuß aus?

Das geht wohl über ein makefile, mit dem ich aber nichts zu tun habe. 
Das legt das Atmel Studio selber an. Compiler zu Fuß? So weit bin ich 
noch lange nicht... ;-)

von AVRli .. (avrli)


Lesenswert?

Dirk B. schrieb:
> Definiere solche Dinge in den Projektoptionen als Compilerparameter.

Und das habe ich nun gemacht und es läuft. HURRA!
Kann jetzt mit 2 Symbole, entsprechend Projektbezogen, umschalten. :-D

Super so habe ich mir das vorgestellt...

Grüße AVRli...

von C. (Gast)


Lesenswert?

AVRli .. schrieb:
> Ich war der Annahme das dies durch...#ifndef _tools_conf_
> #endif
> in der tools.h geschieht. Ist_tools_conf_ (durch Aufruf im main.c)
> definiert, den Block auslassen.


Jede c-Datei wird einzeln compiliert.
Vor dem kompilieren macht der Präprozesser bei den #defines, #includes 
ect. eine Textersdetzung an den Stellen. Sodass quasie eine einzelne 
Datei entsteht.


Nur weil du in der main.c ein
#include "tools_cfg.h"
einbaust, hat das überhaut keine auswirkungen beim compilieren der 
tools.c

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.