mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C - Files verschachteln


Autor: franzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe 3 C-Files geschrieben.
Kann ich diese verschachteln, damit in einem File eine Variable gesetzt 
wird, die im anderen Files ausgewertet wird??

Wenn das funktionieren sollte, wo muss man dann die Variblen definieren?

mfg franzi

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// variable.h:
extern int meine_globale_variable; // Deklaration

// datei1.c:
#include "variable.h"
int meine_globale_variable = 0;    // Definition

// datei2.c:
#include "variable.h"
void funktionausdatei2(void)
{
   meine_globale_variable = 23;    // Zugriff
}

// datei3.c:
#include "variable.h"
void funktionausdatei3(void)
{
   meine_globale_variable = 42;    // Zugriff
}

Autor: franzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE! ich werde es später ausprobieren

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine beliebte Methode, vor allem bei vielen globalen Variablen, ist 
auch:

// variable.h:
#ifdef define_variables
#define extern
#endif
extern int meine_globale_variable; // Deklaration
// wird zur Definition, wenn define_variables definiert ist,
// weil dann "extern" durch nichts ersetzt wird

// datei1.c:
#define define_variables // !!!!
#include "variable.h"      // hier wird definiert

// datei2.c:
#include "variable.h"      // und hier extern deklariert
void funktionausdatei2(void)
{
   meine_globale_variable = 23;    // Zugriff
}

// u.s.w.

Der Vorteil dieser Behandlung ist, dass alle globalen Variablen nur
noch in einer einzigen Datei vorkommen müssen.

Gruß Johannes

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Nachteil ist, dass du diese Systematik mit
einer Initialisierung einer Variablen in Variable.h
ganz leicht aushebeln kannst.

extern int MeineVariable = 5;

wird als Definition gewertet und das 'extern' wird
ignoriert.
Im Endeffekt landet man dann bei 'duplicate definitions'
im Linker.

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz
Ich hab ja nicht behauptet, dass diese Methode "wasserdicht" sei.
Klar kannst Du praktisch alles, was Ansi-C-konform ist, immer noch 
irgendwie aushebeln.
Übrigens würde Dein Beispiel auch Stefans Vorschlag aushebeln...
Und mich würde mal interessieren, wofür Dein Beipiel überhaupt gut sein 
soll.

Gruß Johannes

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wofür Dein Beipiel überhaupt gut sein soll.

Es soll einfach nur demonstrieren, dass nicht alles
Gold ist was glänzt. Mehr nicht. Ich hab niemanden kritisiert,
ich hab niemanden dafür verdammt. Gar nichts.
Ich will einfach nur einen mögliche Falle aufzeigen.
Das ging mir nämlich in meinen C Anfängen (so um 1990 rum)
einfach nicht in den Schädel: Ich hatte genau die gleiche
Systematik entdeckt und sie genauso toll gefunden. Eines Tages
habe ich dann eine Initialisierung hinzugefügt und plötzlich
'seltsame' Fehlermeldungen erhalten auf die ich mir keinen Reim
machen konnte. Und es hat mich einige Zeit gekostet herauszufinden
was da Sache ist.

Und ich finde es fair, dass wenn man eine Methode (zu Recht)
mit Vorteilen anpreist, man auch die Nachteile dazu nennen sollte:
Man kann Initialisierungen nicht in diese Systematik einbinden.

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Erläuterung. Und entschuldige bitte, wenn Dir meine
Nachfrage als gegen Dich erschienen ist.
So war sie bestimmt nicht gemeint, ich wollte halt nur wissen,
wofür die Initialisierung einer extern deklarierten Variablen
gut sein soll, wenn eh jede benutzende Instanz sie selber nach
Bedarf neu besetzt.
Und dass die Initialisierung in dieser Systematik nicht klappt,
war mir einfach neu, weil ich derlei bisher nie gemacht habe.

Gruß Johannes

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.