www.mikrocontroller.net

Forum: Compiler & IDEs extern Funktionen


Autor: Jenzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Wazu sind in den meinsten header dateien die Funktionen mit
extern deklariert ? es funktioniert doch auch ohne dieses extern.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guter Stil.  Es ist halt eine Deklaration, die auf etwas verweist,
das woanders implementiert ist.  Bei Variablendeklarationen muss
es streng genommen sogar davor, weil sich die Deklaration von der
Definition nur dadurch unterscheiden lässt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
extern / static bedeutet, ob eine Funktion / Variable für alle Objekte
oder nur für das aktuelle Objekt zugreifbar sind.

Dabei sind Funktionen per default extern, Variablen static.

Eine Ausnahme ist der AVR-GCC, bei dem Variablen auch ohne "extern"
stillschweigend als extern angenommen werden, wenn sie in mehreren
Objekten verwendet werden.

Andere Compiler (z.B. Keil C51) legen diese Variablen dann auch separat
an, d.h. sie haben völlig unterschiedliche Adressen und Werte.

static lokale Variablen (innerhalb einer Funktion) haben eine andere
Bedeutung, sie bleiben die ganze Programmlaufzeit erhalten wie globale
Variablen.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Dabei sind Funktionen per default extern, Variablen static.

Nein.  Variablen sind per default global.

> Eine Ausnahme ist der AVR-GCC, bei dem Variablen auch ohne
"extern"
> stillschweigend als extern angenommen werden, wenn sie in mehreren
> Objekten verwendet werden.

Sie werden stillschweigend überlagert, d.h. man bekommt keine
Mehrfach-Definitions-Fehler gemeldet.  Mit -fno-common kann man diese
auch haben, wenn man will...

> Andere Compiler (z.B. Keil C51) legen diese Variablen dann auch
> separat an, d.h. sie haben völlig unterschiedliche Adressen und
> Werte.

Das wäre allerdings eine Verletzung des Standards.  Sowas darf nur
passieren, wenn sie explizit als `static' deklariert sind.

6.2.2 Linkages of identifiers

...

3 If the declaration of a file scope identifier for an object or a
  function contains the storageclass specifier static, the identifier
  has internal linkage.

...

5 If the declaration of an identifier for a function has no
  storage-class specifier, its linkage is determined exactly as if it
  were declared with the storage-class specifier extern. If the
  declaration of an identifier for an object has file scope and no
  storage-class specifier, its linkage is external.

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.