Forum: Compiler & IDEs Was bedeutet dieser Warnung?


von Bandit (Gast)


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.

von Matthias (Gast)


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

von Bandit (Gast)


Lesenswert?

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

von OldBug (Gast)


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...

von Matthias (Gast)


Lesenswert?

Hi

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

Matthias

von Jörg Wunsch (Gast)


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.

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.