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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von AVRli .. (avrli)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich haben ein Programmteil den ich in mehreren Programmen verwenden 
möchte.
Dieser ist in...
/* tools.h */
#ifndef _tool_h_
#define _tool_h_

#ifndef _tools_conf_
# warning "tool.h default configuration..."
  #define _STORED_FAR    1
  #define _ALIGINMENT    1
#endif

void mytools_function();

#endif

...und...
/* tools.c */
#include "tools.h"
void mytools_function()
{
#if (_ALIGINMENT == 1)
  /* do something only when _ALIGMENT == 1 
  ...
  ...
  ...
  */
#end
}

...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...
#ifndef _tools_conf_
#define _tools_conf_

  #define _STORED_FAR    0
  #define _ALIGINMENT  0

# warning "tools configuration for App_A loaded..."
#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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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...
#ifndef _tools_conf_
#endif
in der tools.h geschieht. Ist
_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
#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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.