Forum: Compiler & IDEs fehler bei extern deklaration


von tim (Gast)


Lesenswert?

Hallo, ich hab da so ein Problem.
Ich hab in einem projekt einen Header eingebunden, der mehrere globale 
Funktionen definiert. Diese möchte ich natürlich in den anderen Dateien 
nutzen. Da hab ich die entsprechende Deklaration mit 'extern' 
deklariert, aber dann bekomme ich an dieser Stelle "variable or field 
'name' declared void". Ich habe auch schon die Fehlermeldung gegooglet, 
aber die scheint ziemlich oft aufzutreten und ist deshalb wohl als 
Diagnose auch nicht so geeignet.
Hier noch mal der Code (C++):

Uart_v2.h
1
  inline void uart_puts (const char* s)
2
  {
3
    while(*s != '\0')
4
    {
5
      uart_putch(*s);
6
      ++s;
7
    }
8
  }

MTP_out.cpp
1
  //Nachricht absenden
2
  //
3
  extern void uart_puts(complete_msg);
4
  //

Kann mir jemand erklären, was da falsch läuft??

Freundliche Grüße, Tim

von g457 (Gast)


Lesenswert?

> Kann mir jemand erklären, was da falsch läuft??

Massiv falsche Nutzung von extern. Schreibs mal so auf:

MTP_out.cpp:
1
   #include "Uart_v2.h"
2
3
   [..]
4
   // Nachricht absenden
5
   uart_puts(complete_msg);

von tim (Gast)


Lesenswert?

hm.. das hatte ich vorher, da gab es dann ~26 je zweimal "multiple 
defined". hab das gegooglet und da kam dann, man soll extern benutzen^^

Wieso braucht man das in diesem Fall nicht?

von Stefan E. (sternst)


Lesenswert?

tim schrieb:
> hm.. das hatte ich vorher, da gab es dann ~26 je zweimal "multiple
> defined".
1
inline void uart_puts (const char* s)
->
1
static inline void uart_puts (const char* s)

tim schrieb:
> hab das gegooglet und da kam dann, man soll extern benutzen^^

Bei Variablen, nicht Funktionen.

von Timmo H. (masterfx)


Lesenswert?

tim schrieb:
> hm.. das hatte ich vorher, da gab es dann ~26 je zweimal "multiple
> defined".
im Header einfach
1
#ifndef UART_V2_H_
2
#define UART_V2_H_
3
4
  inline void uart_puts (const char* s)
5
  {
6
    while(*s != '\0')
7
    {
8
      uart_putch(*s);
9
      ++s;
10
    }
11
  }
12
13
#endif

von Stefan E. (sternst)


Lesenswert?

Timmo H. schrieb:
> im Header einfach

Nö. Include-Guards verhindern das mehrfache Einbinden innerhalb eines 
Source-Files. Sie haben keinen Einfluss auf ein "multiple defined", das 
entsteht, wenn der Header in mehrere C-Files eingebunden wird.

von g457 (Gast)


Lesenswert?

> hm.. das hatte ich vorher, da gab es dann ~26 je zweimal "multiple
> defined". hab das gegooglet und da kam dann, man soll extern benutzen^^

Wie schon geschrubt wurde nicht für Funktionsdeklarationen. Aufsplitten 
in Header und Implementierung.

von Rolf M. (rmagnus)


Lesenswert?

Stefan Ernst schrieb:
> Timmo H. schrieb:
>> im Header einfach
>
> Nö. Include-Guards verhindern das mehrfache Einbinden innerhalb eines
> Source-Files. Sie haben keinen Einfluss auf ein "multiple defined", das
> entsteht, wenn der Header in mehrere C-Files eingebunden wird.

Nein, aber inline hat einen Einfluss darauf.

von Stefan E. (sternst)


Lesenswert?

Rolf Magnus schrieb:
> Stefan Ernst schrieb:
>> Timmo H. schrieb:
>>> im Header einfach
>>
>> Nö. Include-Guards verhindern das mehrfache Einbinden innerhalb eines
>> Source-Files. Sie haben keinen Einfluss auf ein "multiple defined", das
>> entsteht, wenn der Header in mehrere C-Files eingebunden wird.
>
> Nein, aber inline hat einen Einfluss darauf.

Nö, auch nicht. Der gleiche Fehler würde sowohl mit als auch ohne 
"inline" kommen (bei Implementierung im Header-File). Was hier den 
entscheidenden Einfluss hat, ist das "static" was ich oben gepostet 
habe.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

g457 schrieb:
> Wie schon geschrubt wurde nicht für Funktionsdeklarationen.

Man darf das dort auch verwenden, aber natürlich nur alternativ
zu “static”, und außerdem nur bei der Deklaration (im Header).  Hier
wurde aber versucht, es beim Aufruf zu benutzen.

Bei “inline” ist es aber sehr sinnvoll (sofern man weiß, dass die
Funktion wirklich klein genug ist fürs Inlining), dass man sich zur
Gewohnheit macht, die Deklaration/Definition dafür immer “static
inline” anzulegen.  Die Semantik für “extern inline” will man sich
eigentlich nicht antun.

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.