mikrocontroller.net

Forum: PC-Programmierung C Programmierung Compiler/Linker


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Denis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute,

ich hab folgendes problem bei einer Aufgabe und zwar geht es darum zu 
erkennen wo ein Fehler liegt und ob dieser vom Compiler oder vom Linker 
erkannt wird.

Im Anhang sind zwei unterschiedliche programme i) und ii)
Der Compiler gibt ja Fehlermeldungen aus wenn z.B ein Syntaxfehler 
vorliegt oder eine nicht eingeführte Variable benutzt wird. Er geht 
dabei ja jede Datei einzel durch wenn also kein Syntaxfehler vorliegt 
ist alles gut und er spuckt keine Fehler aus.

Beim Linker hingegen geht es ja darum fehlerhafte verweise zu finden 
oder wenn zwei Funktionen mit dem gleichen Namen existieren etc.

Keine Ahnung ob ich das richtig verstanden habe, trotzdem erkenne ich 
bei den Programmabschnitten jetzt nicht wo die Compiler/Linker-fehler 
vorliegen.

Wäre cool wenn mir da jemand auf die Sprünge helfen könnte.

Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liegt der Unterschied zwischen den Programmen und welchen Einfluss 
könnte er haben?

Warum tippst du das nicht einfach mal in einen Computer ein und schaust, 
was passiert? Anhand der real auftauchenden Fehlermeldung kannst du ja 
feststellen, ob der Compiler oder Linker ein Problem haben.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denis schrieb:
> oder eine nicht eingeführte Variable benutzt wird.

Variable ist zu kurz gegriffen.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Und die Dateiendung .cpp deutet darauf hin, daß das C++ ist, kein C.

Auch wenn’s gleich aussieht, ist das bei der Fragestellung schon 
entscheidend.

Oliver

Autor: nfet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht aber C Programmierung drüber. Nicht definierte Funktionen sind dem 
Compiler egal, nicht definierte Variablen interessieren ihn. Grund: 
Funktionen muss man nur aufrufen, da muss man nix drüber wissen. Aber 
Variablen könnten unpassende Typen haben.
Da prog2 nicht kompiliert, wird sich der linker bei prog1 über das nicht 
gefundene addx beschweren.
Ausprobieren tut nicht weh.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht wohl eher um Programm A und B.

Oliver

Autor: loeti2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Prog A und B sind in prog2.cpp jeweils die Variable x unbekannt,
deshalb kann diese Quelldatei nicht übersetzt werden.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
nfet schrieb:
> Steht aber C Programmierung drüber.

Und in der Aufgabenstellung steht .cpp.
Wer sagt, dass der TO die Aufgabe verstanden hat?

Man könnte man zumindest mal drüber nachdenken, ob das was am Problem 
ändert.

Oliver

Autor: A. S. (achs)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
nfet schrieb:
> Nicht definierte Funktionen sind dem Compiler egal, nicht definierte
> Variablen interessieren ihn. Grund: Funktionen muss man nur aufrufen, da
> muss man nix drüber wissen. Aber Variablen könnten unpassende Typen
> haben.

Das gilt für beides, deshalb ist beides in C egal. Er nimmt int an. Als 
variable, als Funktionsparameter, als Rückgabewert, ...

Autor: Helmut S. (helmuts)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Datei .cpp heißt, dann wird doch garantiert mit C++ kompiliert. 
Da wäre dann prog1.cpp in B richtig. (In C wären die Version in A und B 
OK.)

prog2.cpp ist weder in C++ noch in C vollständig. Da fehlt eine Zeile.

Autor: nfet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bis auf .cpp deutet alles auf C hin.

Aber egal, dann eben einmal die Antwort für C und einmal für C++:
C:
Programm A:
prog1.cpp kompiliert: https://godbolt.org/z/28PT2P
prog2.cpp kompiliert nicht (error: 'x' undeclared) 
https://godbolt.org/z/a9c5wh
Da prog2 nicht kompiliert, gibt es nichts, womit man prog1 linken 
könnte. Wenn man also ein executable erstellen wöllte, würde der Linker 
sich beschweren mit einer Meldung wie "undefined reference to `addx'" 
(https://godbolt.org/z/7CeJya)
Für Programm B gilt genau das gleiche wie für Programm A.

C++:
Programm A:
prog1.cpp kompiliert nicht ( error: 'addx' was not declared in this 
scope): https://godbolt.org/z/k3WlNV
prog2.cpp kompiliert nicht (error: 'x' undeclared) 
https://godbolt.org/z/JVny_3)
Damit gibt es absoult nix, was man linken könnte.

Programm B:
prog1.cpp kompiliert (https://godbolt.org/z/ceLkgO)
Für prog2.cpp gilt das gleiche wie bei A.
Da prog2 nicht kompiliert, gibt es nichts, womit man prog1 linken 
könnte. Wenn man also ein executable erstellen wöllte, würde der Linker 
sich beschweren mit einer Meldung wie "undefined reference to 
`addx(int)'"  (siehe link davor)


Fassen wir zusammen:
Meine Aussage von oben hat absoult bestand, wer mir nicht glaubt, möge 
es bei sich selbst einfach testen, soviel ist das nicht zum tippen.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nfet schrieb:
> Steht aber C Programmierung drüber. Nicht definierte Funktionen sind dem
> Compiler egal, nicht definierte Variablen interessieren ihn. Grund:
> Funktionen muss man nur aufrufen, da muss man nix drüber wissen. Aber
> Variablen könnten unpassende Typen haben.

Selbstverständlich können auch Funktionen unpassende Typen haben. Es 
gibt schließlich so Dinge wie Parameter und einen Return-Typ. Wenn das 
nicht passt, kracht's gegebenenfalls.
In C ist es lediglich so, dass der Compiler beim Aufruf einer Funktion 
mehr oder weniger rät, von welchem Typ sie ist, wenn er sie nicht kennt. 
Das ist letztendlich der Kompatibilität zu den Anfängen von C 
geschuldet, als es Prototypen noch nicht gab.
In dem hier gezeigten Fall würde der Compiler zufällig das richtige 
raten, da er als Parameter einen int annimt, weil ein solcher übergeben 
wurde und als return-Typ ebenfalls int, weil das implizit immer 
angenommen wird.
In C++ ist dagegen erforderlich, dass der Compiler den Typ der Funktion 
kennt. Das ergibt sich schon alleine daraus, dass man Funktionen 
überladen kann.

: Bearbeitet durch User
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Rolf M. schrieb:
> In C ist es lediglich so, dass der Compiler beim Aufruf einer Funktion
> mehr oder weniger rät, von welchem Typ sie ist, wenn er sie nicht kennt.

Er gibt aber eine Warnung aus. Und sauber geschriebene Programme 
erzeugen keine Warnungen.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Er gibt aber eine Warnung aus.

Und sollte bei C99 oder C11 eigentlich eine Fehlermeldung ausgeben, da 
es die implizite Deklaration da nicht mehr gibt.
gcc nimmt zwar defaultmässig C99, gibt aber trotzdem nur eine Warnung 
aus.
Mit -pedantic-errors wirds dann zur Fehlermeldung.

Oliver

: Bearbeitet durch User
Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> In C ist es lediglich so, dass der Compiler beim Aufruf einer Funktion
> mehr oder weniger rät, von welchem Typ sie ist, wenn er sie nicht kennt.

Der Compiler rät nicht!
sondern geht von einem Interger aus.

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GEKU schrieb:
> Rufus Τ. F. schrieb:
> In C ist es lediglich so, dass der Compiler beim Aufruf einer Funktion
> mehr oder weniger rät, von welchem Typ sie ist, wenn er sie nicht kennt.
>
> Der Compiler rät nicht!
> sondern geht von einem Interger aus.

Sorry leider falsch zitiert.

Autor: Walter K. (walter_k488)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
nfet schrieb:
> Steht aber C Programmierung drüber. Nicht definierte Funktionen sind dem
> Compiler egal, nicht definierte Variablen interessieren ihn. Grund:
> Funktionen muss man nur aufrufen, da muss man nix drüber wissen.

LoL

so wie Du nichts über Deklaration und Definition in C weisst!

Autor: Walter K. (walter_k488)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> nfet schrieb:
>> Nicht definierte Funktionen sind dem Compiler egal, nicht definierte
>> Variablen interessieren ihn. Grund: Funktionen muss man nur aufrufen, da
>> muss man nix drüber wissen. Aber Variablen könnten unpassende Typen
>> haben.
>
> Das gilt für beides, deshalb ist beides in C egal. Er nimmt int an. Als
> variable, als Funktionsparameter, als Rückgabewert, ...

In welchem C - Standard wurde denn die implizite Typendeklaration 
eingeführt?
Muss ich wohl verpasst haben :-(

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter K. schrieb:
> In welchem C - Standard wurde denn die implizite Typendeklaration
> eingeführt?

Das war im fossilen "K&R-C" so, der C-"Standard" vor C89.

Der kannte keine Funktionsprototypen und damit auch keine 
Typüberprüfungen bei Funktionsaufrufen.

Bei Funktionen, die ohne Rückgabetyp deklariert wurden, wurde implizit 
von int als Rückgabetyp ausgegangen.

Glücklicherweise findet man nur noch sehr, sehr selten Sourcecode, der 
für diesen fossilen C-Dialekt geschrieben ist.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Das war im fossilen "K&R-C" so, der C-"Standard" vor C89.

C89 führte die Funktionsprototypen ein, aber erst in C99 sind die 
impliziten Funktionsdeklarationen nicht mehr enthalten.

Oliver

Autor: nfet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter K. schrieb:
> LoL
>
> so wie Du nichts über Deklaration und Definition in C weisst!

Naja, nichts würde ich das nun nicht nennen. Ich habe genau dargelegt, 
was Compiler und was Linkerfehler produziert.

Ich habe das auch mithilfe eines online Compilers gezeigt.

Meine Begründung kann man als zu ungenau kritisieren, aber (Achtung 
reine Behauptung meinerseits) ich behaupte, genau das wird der Grund 
gewesen sein, warum man in den Anfängen von C keinen entscheidenden 
Mehrwert in der Deklaration von Funktionen gesehen hat.

A. S. schrieb:
> Das gilt für beides, deshalb ist beides in C egal. Er nimmt int an. Als
> variable, als Funktionsparameter, als Rückgabewert, ...

Das halte ich für eine gewagte Behauptung, mein Link oben zeigt dass 
Gegenteil:
https://godbolt.org/z/JVny_3

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) undefinde function addx
2) redefined function addx

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.