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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.