Merkt der Linker es nicht, wenn Funktion und Aufruf nicht passen?

OP Persönliche Seite #1363759
Hallo,
mir ist gerade aufgefallen, dass es der Linker anscheinend nicht merkt, 
wenn eine Funktion einmal mit anderen Parametern aufgerufen wird, als in 
der Implementierung der Funktion angegeben. Ist dies normal, oder gibt 
es ein Linker Parameter um in solchen Fällen eine Warnung zu erzeugen? 
Sonst könnte hier doch eine sehr schwer aufzuspürende Fehlerquelle 
liegen.

Erzeugt hatte ich die Konstellation wie folgt:
Definition in der .h Datei mit einem Parameter mehr als in der 
Implementierung in der .c Datei, wobei die .c Datei versehentlich nicht 
ihren eigenen Header eingebunden hat. Aus einer anderen .c Datei dann 
ein Aufruf passend zur Definition in der .h Datei. Somit konnte der 
Compiler noch keinen Fehler feststellen.
Gast #1363794
> Ist dies normal, oder gibt es ein Linker Parameter um in solchen
> Fällen eine Warnung zu erzeugen?

Der Linker kennt nur Symbole, die er versucht, zu Deckung zu bringen.
In C entsprechen diese Symbole im Wesentlichen den Funktions- bzw.
Variablennamen. Deswegen ist es sogar möglich, aus einer C-Datei eine
"Funktion" aufzurufen, die in einer anderen C-Datei in Wirklichkeit als
Variable definiert wurde, was natürlich zu einem Segfault führt.

Anders verhält es sich bei C++: Hier werden Informationen über eine
Funktion zusätzlich zum Funktionnamen in den Symbolnamen hineinkodiert.
Nur mit diesem Trick ist das Überladen von Funktionen möglich. Als
angenehmen Nebeneffekt bekommt man in deinem Fall einen Linker-Fehler
angezeigt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.