mikrocontroller.net

Forum: Compiler & IDEs Was bedeutet dieser Warnung?


Autor: Bandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, mein Compiler gibt mir immer folgende Warnung aus:
labornetzteil.c:32: warning: implicit declaration of function
`interrupt_init'

Programmiert ist das mit WinAVR.

Die unterfunktion sieht folgendermassen aus:

void interrupt_init(void)
{
  MCUCR = 0x09;
  PCMSK1 = 0x7c;
  GICR = 0x50;
  sei();
}

aufgerufen habe ich sie so:

  interrupt_init();

Die Funktion ist in einer extra C-Datei und wird im Main aufgerufen.

Danke schon mal für eure Hilfe.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du machst die Funktion interrupt_init(); dem Compiler nicht bekannt
wenn er die main-Funktion übersetzt. Du solltest zu jeder externen
c-Datei die du erstellst eine sog. Header-Datei erstellen in der du
alle Funktionsprototypen der Funktionen reinschreibst die du ausßerhalb
dieser c-Datei verwenden willst. In deinem Fall also etwa sowas in die
Headerdatei:

void interrupt_init();

Die Headerdatei bindest du dann mit #include "xxx.h" in deine main.c
ein.

Matthias

Autor: Bandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das wars.
Wenn doch nur alles so einfach wär :-))

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

>void interrupt_init();

Ich würde hier nicht auf das zweite "void" verzichten. Ich glaube,
diese schreibweise stammt aus C++, bei dem es so explizit erlaubt ist.
So weit ich weis, ist diese Schreibweise für stdc allerdings falsch,
die meisten Compiler tolerieren das aber...

void interrupt_init(void);

Gruß,
Patrick...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

stimmt. Der GCC kommentiert das mit einer Warning. Also immer schön
aller Parametertypen in der Parameterliste angeben.

Matthias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist übrigens nicht streng genommen falsch, aber eher `deprecated'.

Wenn man in C++ eine Funktion

... foo();

deklariert, dann ist dies äquivalent zu

... foo(void);

Wenn man das in C macht, wird hingegen ausgedrückt, daß die Funktion
foo() `old style parameter lists' (sogenanntes K&R C) benutzt, d. h.
die Anzahl der Argumente für den Aufruf der Funktion wird durch die
Deklaration nicht festgelegt.  Das war bis zu C90 (ANSI-C 89) die
übliche Deklarationsweise für Funktionen.  Der Compiler hatte keine
Chance, Anzahl und Typ der Parameter zu überprüfen oder gar ggf.
notwendige Typkonvertierungen vorzunehmen.

Diese Form wird lediglich für Rückwärskompatibilität mit altem Code
noch unterstützt, in neuem Code sollte man sie generell vermeiden.

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.