Forum: Mikrocontroller und Digitale Elektronik Compiler meckert nicht, obwohl er müsste


von öhm (Gast)


Lesenswert?

Guten Tag!


Ich habe wieder mal eine ganz kurze Frage lol:

Ich habe in meinem Projekt main.c, test.c Dateien mit der dazugehörigen 
header Datei test.h.

Nun habe ich in meiner main.c vergessen die test.h einzubinden und führe 
in
meiner main.c Funktionen aus, die in der test.h deklariert sind.

Erstaunlicherweise hat der Compiler nicht gemekert. Das Projekt wurde 
compiliert und konnte ausgeführt werden. (Allerdings traten 
verständlicherweise seltsame Effekte auf. Variablenwerte wurden 
überschrieben usw...)

Ich habe lange nicht verstanden was da los ist, bis ich bemerkt habe, 
dass ich #include test.h  auskommentiert hatte.

Wie ist es möglich, dass das Projekt compiliert werden konnte und sogar 
teilweise funktioniert hat???

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Deine Freunde sind
1
-Werror=missing-prototypes
2
-Werror=strict-prototypes

von Karl H. (kbuchegg)


Lesenswert?

öhm schrieb:

> Nun habe ich in meiner main.c vergessen die test.h einzubinden und führe
> in
> meiner main.c Funktionen aus, die in der test.h deklariert sind.

Soweit so gut.

> Erstaunlicherweise hat der Compiler nicht gemekert.

Er ist auch nicht dazu verpflichtet.
Dieser Fall ist kein Fehler (nur die sind fakultativ). Wenn der Compiler 
nett ist, dann schmeisst er eine Warnung. Wenn du allerdings den 
Warning-Level tief genug ansetzt, dann eben nicht.

> Wie ist es möglich, dass das Projekt compiliert werden konnte und sogar
> teilweise funktioniert hat???

Weil in dem Fall, in dem der Compiler keinen Protoypen sieht, er mit 
Standardannahmen arbeiten muss. Er kann eine Warnung geben. Er kann - 
aber er muss nicht.

Warnungen einschalten und den Warning Level möglichst hoch setzen.

von öhm (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Warnungen einschalten und den Warning Level möglichst hoch setzen.

Hmm ok. Hab ich jetzt gemacht.


Hätte vermutet, dass ohne eingefügtes #include "test.h"  garnix mehr 
funktioniert. Der GCC halt mal wieder.


Danke euch.

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


Lesenswert?

öhm schrieb:
> Der GCC halt mal wieder.

C halt mal wieder.  “All functions return an int and take an
arbitrary number of arguments” ist das uralte Paradigma des
ursprünglichen K&R-Cs, das dahinter steht. Implizit war dann
selbstverständlich ein int auch gleich identisch zu einem
x-beliebigen Zeiger.

Hat schon so ihre Altlasten, die Sprache. :)  (Bevor unser
beliebter C-Hasser jetzt wieder kommt: derartige Paradigmen
entstammen natürlich durchaus der Sichtweise eines
Assemblerprogrammierers.)

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:
> öhm schrieb:
>> Der GCC halt mal wieder.
>
> C halt mal wieder.  “All functions return an int and take an
> arbitrary number of arguments” ist das uralte Paradigma des
> ursprünglichen K&R-Cs, das dahinter steht.

Mit der Ergänzung "we trust the programmer to know how many arguments a 
function takes and what their data types are, paired with the knowledge 
of the implicite propagation rules."


> Hat schon so ihre Altlasten, die Sprache. :)

:-)
Wobei an dieser Stelle die Konservativität des Gremiums schon 
grenzwertig ist. Keinen Protoyp im Scope zu haben sollte ein Fehler 
sein. Selbst dann wenn ältere Programme dann nicht mehr fehlerfrei 
compilieren. Sie können von einer Code-Modernisierung nur gewinnen. Oder 
kennt heutzutage noch irgendwer irgendwen, der das Hasardspiel eingeht, 
ohne Protoypen zu compilieren?

>  (Bevor unser
> beliebter C-Hasser jetzt wieder kommt: derartige Paradigmen
> entstammen natürlich durchaus der Sichtweise eines
> Assemblerprogrammierers.)

:-)
Und er wird sich schwer tun, selbst K&R C daraus einen Strick zu drehen.

von Lacsap (Gast)


Lesenswert?

> Keinen Protoyp im Scope zu haben sollte ein Fehler sein.
Das zeigt uns wieder, dass bei C aufzuhören ein Fehler ist. Besser wäre 
ein D, F, E, ..., J. :-D

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Keinen Protoyp im Scope zu haben sollte ein Fehler sein.

Was spricht dagegen, die entsprechende Option zu setzen?

Lacsap schrieb:
> Das zeigt uns wieder, dass bei C aufzuhören ein Fehler ist. Besser wäre
> ein D, F, E, ..., J. :-D

Hat schonmal jemand mit dem neuen D-Frontend im GCC (GDC) rumgespielt?

http://de.wikipedia.org/wiki/D_(Programmiersprache%29

von Karl H. (kbuchegg)


Lesenswert?

Johann L. schrieb:
> Karl Heinz Buchegger schrieb:
>> Keinen Protoyp im Scope zu haben sollte ein Fehler sein.
>
> Was spricht dagegen, die entsprechende Option zu setzen?

Das sie nicht vom Standard gefordert ist.
Wenn ein Compiler das anbietet - schön. Aber er muss nicht. Und genau da 
liegt das Problem. Es gibt IMHO keinen vernünftigen Grund, so ein 
Verhalten NICHT in den offiziellen Standard mit aufzunehmen.

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


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das sie nicht vom Standard gefordert ist.

Mir ist so, als wären Prototypen bei C99 Pflicht.

Allerdings ist -std=c99 (oder gnu99) halt nach wie vor nicht die
Voreinstellung, sondern immer noch -std=gnu89.

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:
> Karl Heinz Buchegger schrieb:
>> Das sie nicht vom Standard gefordert ist.
>
> Mir ist so, als wären Prototypen bei C99 Pflicht.

Fast.
Eine Deklaration ist Pflicht geworden. Aber es muss kein kompletter 
Protoyp sein. D.h.
1
int foo();
2
3
int main() {
4
  int i = foo(5); 
5
}

ist ok. Der Deklarationspflicht ist genüge getan.

Warum man das nicht gleich in Richtung Prototyp geändert hat? Ich hab 
keine Ahnung.
Lustigerweise wird nämlich für variadische Funktionen ein Protoyp 
gefordert oder es gibt 'undefined behaviour'

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Johann L. schrieb:
>> Karl Heinz Buchegger schrieb:
>>> Keinen Protoyp im Scope zu haben sollte ein Fehler sein.
>>
>> Was spricht dagegen, die entsprechende Option zu setzen?
>
> Das sie nicht vom Standard gefordert ist.
> Wenn ein Compiler das anbietet - schön. Aber er muss nicht.
> Und genau da liegt das Problem. Es gibt IMHO keinen vernünftigen
> Grund, so ein Verhalten NICHT in den offiziellen Standard mit
> aufzunehmen.

Rant : Pragmatismus = 1 : 0

:-)

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.