fehler bei extern deklaration

Gast #3143693
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
Gast #3143710
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);
Gast #3143788
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.
#3144033
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.
Moderator Persönliche Seite #3144527
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren