ich habe neulich ein bisschen mit meinem Compiler (gcc 4.0 auf Mac OS X
10.5.8) rumgespielt und dabei ist mir folgendes aufgefallen:
int main()
{
int i;
i = 0;
int j;
j = i;
return j;
}
kompiliert anstandslos (auch mit -Wall), egal ob in c99, c89, oder ansi
(auch mit jeder anderen Variablendeklaration beliebig weit im Block
drinnen versteckt).
Dagegen compiliert aber z. B.
int main()
{
...
for(int i = 0; i <= 10; i++) ...
...
}
wie zu erwarten nur in c99, in den anderen gibt es einen Fehler.
Ist das normal? Oder sollte der compiler nicht zumindest im erstenfall
warnen (au�er bei c99)?
Bastian
> To select this standard in GCC, use one of the options �-ansi�,
> �-std=c89� or �-std=iso9899:1990�; to obtain all the diagnostics
> required by the standard, you should also specify �-pedantic�
Jain, ist eine Entscheidung der gcc Entwickler. Wie beschreiben
sie es so sch�n "The -ansi option does not cause non-ISO programs to be
rejected gratuitously."
Um den Compiler zum meckern zu bekommen musst du noch -pedantic
als Kommandozeilenparameter mit�bergeben, dann meldet auch der gcc
brav "warning: ISO C90 forbids mixed declarations and code" wie
es sich f�r einen echten C90 Compiler geh�rt. :-)
Tom
> Jain, ist eine Entscheidung der gcc Entwickler. Wie beschreiben
> sie es so sch�n "The -ansi option does not cause non-ISO programs to be
> rejected gratuitously."
>
> Um den Compiler zum meckern zu bekommen musst du noch -pedantic
> als Kommandozeilenparameter mit�bergeben, dann meldet auch der gcc
> brav "warning: ISO C90 forbids mixed declarations and code" wie
> es sich f�r einen echten C90 Compiler geh�rt. :-)
Ah, so bring ich den dazu, mir das mitzuteilen. Irgendwie h�tte ich
erwartet, dass '-Wall' sowas wie '-pedantic' auch schon mit drin hat.
Nun gut, dann lass ich jetzt eben mal mit '-Wall -pedantic' noch mehr
als nur "alle" Warnungen ausgeben. ;-)
Danke, auch an Stefan.
Bastian
Wenn du noch mehr als "alle" Warnungen haben willst, musst du aber noch
'-W' bzw. neuerdings '-Wextra' dazupacken :-)
Stefan
> Wenn du noch mehr als "alle" Warnungen haben willst, musst du aber noch
> '-W' bzw. neuerdings '-Wextra' dazupacken :-)
Danke, das ist auch gut zu wissen.
Leere if-s werden da z. B. gewarnt. Die hab ich doch schon �fters mal.
Was schreib ich denn dann da am besten?
if (is ok) (void)NULL;
else if (usw) usf;
Wird das dann generell gleich bewertet, wie wenn in der ersten Zeile nur
if (is ok);
st�nde, oder bleibt das dem Compiler �berlassen?
Bastian
> Ich dachte auch an �-Wno-empty-body�, was allerdings von der
> von mir verwendeten GCC-Version nicht verstanden wird, obwohl
> sie diese Warnung ausgibt.
>
> http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wempty_002dbody-370
"-Wno-empty-body" gibt es dort nirgends.
Gru�. Claus
> eart...@web.de (Bastian Erdnuess) writes:
> >Leere if-s werden da z. B. gewarnt. Die hab ich doch schon �fters mal.
> >Was schreib ich denn dann da am besten?
>
> {}
Ha, das ist clever. Das h�tt ich jetzt spontan auch f�r einen leeren
Body gehalten, daher bin ich gar nicht auf die Idee gekommen.
Bastian
Die Option heisst aus einem bestimmten Grund -pedantic. Im Deutschen
bezeichnet das, sich genauer an den Wortlaut einer Vorschrift zu halten,
als eigentlich praktikabel waere und dadurch entweder absichtlich das
erzielen von Ergebnissen zu behindern oder jedenfalls diese
Behinderung als letztlich kleineres Uebel in Kauf zu nehmen bereit zu
sein.
Some users try to use `-pedantic' to check programs for strict ISO
C conformance. They soon find that it does not do quite what they
want: it finds some non-ISO practices, but not all--only those for
which ISO C _requires_ a diagnostic, and some others for which
diagnostics have been added.
A feature to report any failure to conform to ISO C might be
useful in some instances, but would require considerable
additional work and would be quite different from `-pedantic'. We
don't have plans to support such a feature in the near future.
(gcc Dokumentation, 'Warning Options')
> Some users try to use `-pedantic' to check programs for strict ISO
> C conformance. They soon find that it does not do quite what they
> want: it finds some non-ISO practices, but not all--only those for
> which ISO C _requires_ a diagnostic, and some others for which
> diagnostics have been added.
> (gcc Dokumentation, 'Warning Options')
Gibt es ein solches Programm, dass nach strenger ISO C Konformit�t
pr�fen kann? Nicht, das ich es wirklich br�uchte, da ich eh nur mit
einem Compiler und auf einer Plattform arbeite, aber trotzdem w�sste ich
manchmal ganz gerne, wo genau ich eine Erweiterung meines Compilers
verwende. (Ohne den ganzen Standard oder die ganze Compiler-
dokumentation durchlesen zu m�ssen -- und mir das dann auch noch merken
;-) )
Bastian
F�r Konformit�tspr�fung, Standardfragen, und �berhaupt w�rde
ich vorschlagen, auch den compiler von Comeaucomputing f�r den
den Werkzeugkasten zu kaufen.
Georg Bauhaus <rm.dash...@futureapps.de> wrote:
> Bastian Erdnuess schrieb:
>> Gibt es ein solches Programm, dass nach strenger ISO C Konformität
>> prüfen kann? Nicht, das ich es wirklich bräuchte, da ich eh nur mit
>> einem Compiler und auf einer Plattform arbeite, aber trotzdem wüsste ich
>> manchmal ganz gerne, wo genau ich eine Erweiterung meines Compilers
>> verwende. (Ohne den ganzen Standard oder die ganze Compiler-
>> dokumentation durchlesen zu müssen -- und mir das dann auch noch merken
>> ;-) )
> Für Konformitätsprüfung, Standardfragen, und überhaupt würde
> ich vorschlagen, auch den compiler von Comeaucomputing für den
> den Werkzeugkasten zu kaufen.
IIRC war der "Tendra C Compiler" auch sehr viel penibler als der gcc,
aber ich bin mir jetzt nicht sicher, ob der bereits mehr als C89/C90
beherrscht (als ich iohn ausprobiert hatte, war das definitiv nicht der
Fall, und die aktuellsten Versionen hatte ich nie ausprobiert).
Allerdings sind momentan die Seiten www.tendra.org und www.ten15.org
(wo man aktuelle Sourcen dafuer findet) beide von mir aus nicht erreich-
bar ...
Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...
> Hallo,
>
> Georg Bauhaus <rm.dash...@futureapps.de> wrote:
> > Bastian Erdnuess schrieb:
> >> Gibt es ein solches Programm, dass nach strenger ISO C Konformit�t
> >> pr�fen kann? Nicht, das ich es wirklich br�uchte, da ich eh nur mit
> >> einem Compiler und auf einer Plattform arbeite, aber trotzdem w�sste ich
> >> manchmal ganz gerne, wo genau ich eine Erweiterung meines Compilers
> >> verwende. (Ohne den ganzen Standard oder die ganze Compiler-
> >> dokumentation durchlesen zu m�ssen -- und mir das dann auch noch merken
> >> ;-) )
> > F�r Konformit�tspr�fung, Standardfragen, und �berhaupt w�rde
> > ich vorschlagen, auch den compiler von Comeaucomputing f�r den
> > den Werkzeugkasten zu kaufen.
>
> IIRC war der "Tendra C Compiler" auch sehr viel penibler als der gcc,
> aber ich bin mir jetzt nicht sicher, ob der bereits mehr als C89/C90
> beherrscht (als ich iohn ausprobiert hatte, war das definitiv nicht der
> Fall, und die aktuellsten Versionen hatte ich nie ausprobiert).
> Allerdings sind momentan die Seiten www.tendra.org und www.ten15.org
> (wo man aktuelle Sourcen dafuer findet) beide von mir aus nicht erreich-
> bar ...
Den werd ich mir mal anschaun, wenn die Seiten wieder verf�gbar sind.
Der Comeau-Computing Compiler klingt an sich auch nicht schlecht, aber
ich f�rchte, die $50 schrecken mich dann doch noch zu sehr ab -- zumal
ich momentan auch nicht die geringste Aussicht sehe, dieses Tool jemals
produktiv einsetzen zu k�nnen.
IIRC kann er C99. Und ja, er ist extrem pedantisch, wenn man das haben
will :-). Soll heißen, er kann dazu gebracht werden, die Zeile
printf("Hallo, Welt\n!");
zu bekritteln, und zwar mit
warning: ignoring return value
oder so. Das bekommt man nur weg, indem man die Rückgabe auf void
castet.
> Allerdings sind momentan die Seiten www.tendra.org und www.ten15.org
> (wo man aktuelle Sourcen dafuer findet) beide von mir aus nicht erreich-
> bar ...
>
Hmmm... das Debian-Paket davon gibt es auch nur für i386 oder als
source... und kompiliert nicht, weil er irgendwelche Dateien nicht
findet. Ach ja, tendra.org ist auch von hier aus down.
> Tschuess,
> Juergen Ilse (jue...@usenet-verwaltung.de)
Tschö,
Markus
--
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
-- gUnter nanonüm in de.alt.anime
Stefan Ram <r...@zedat.fu-berlin.de> wrote:
> Markus Wichmann <null...@gmx.net> writes:
>>will :-). Soll heißen, er kann dazu gebracht werden, die Zeile
>>printf("Hallo, Welt\n!");
>>zu bekritteln, und zwar mit
>>warning: ignoring return value
>>oder so. Das bekommt man nur weg, indem man die Rückgabe auf void
>>castet.
> Das hat doch damals wohl auch das klassische lint unter Umständen
> gemacht. Es ist aber wirklich zuviel des Guten, denn es ist ja
> gerade der Sinn der Ausdrucksanweisung
>
> <Ausdruck> ";"
>
> den Wert des Ausdrucks <Ausdruck> zu ignorieren (zu verwerfen).
Wenn eine Funktion etwas ungleich void zurueckgibt, dann normalerweise,
um das Ergebnis zur Auswertung zur Verfuegung zu stellen. Waehrend viele
sich wohl bei printf evt. noch deiner Meinung anschliessen koennen, gilt
es bei scanf schon eher als Fehler, den Rueckgabewert nicht auszuwerten
(denn man benoetigt ihn fast zwangslaeufig zur Fehlerbehandlung, wenn
nicht alle vorgesehenen Werte eingelesen werden konnten ...). Wenn man
tatsaechlich den Rueckgabewert ignorieren moechte, koennte man dem
Compiler das auch mitteilen (durch den cast auf (void) ...
Es mag zwar unueblich zu sein, das so zu sehen, aber diese Ansicht hat
trotz allem ihre Berechtigung, und genau deshalb warnen viel Compiler
oder Tools wie lint auch in solchen Faellen (wenn man denn pedantische
Pruefung des Programms anfordert) ...
> Allerdings sind momentan die Seiten www.tendra.org und www.ten15.org
> (wo man aktuelle Sourcen dafuer findet) beide von mir aus nicht erreich-
> bar ...
<http://svn.tendra.org/trunk/tendra-www/www.tendra.org/releases/tendra/>
ist aber erreichbar, und da findet man die Sourcen der Version 4.1.2.
Bastian
Nur leider scheint von Haus aus kein Support f�r meine Plattform (Darwin
9.8.0) vorgesehen zu sein :-(
> Bastian
'Funktion' ist eine unguenstige Bezeichnung fuer dieses Konstrukt,
denn es suggeriert, dass 'im Wesentlichen' eine Berechnung
durchgefuehrt wird, die als einziges Ergebnis zu einem Wert
fuehrt. Das ist aber nicht so: Eine Unterroutine kann, zusaetzlich zu
dem, was sie sonst noch tut, einen Rueckgabewert haben, der
moeglicherweise nach der Rueckkehr zum Aufrufer von Nutzen sein
koennte.
[...]
>.Wenn man tatsaechlich den Rueckgabewert ignorieren moechte, koennte
> man dem Compiler das auch mitteilen (durch den cast auf (void) ...
Wenn der Code so geschrieben wurde, dass der Rueckgabewert
tatsaechlich ignoriert wird, ist die Annahme, das sei beabsichtigt
gewesen, dadurch gedeckt, dass es der definierten Bedeutung des
Code-Fragments entspricht. Eine solche Bedeutung gibt es fuer
doppelt-sinnnlose casts (Umwandlung eines ignorierten Wertes in einen
mit undefiniertem Typ) nicht. Deswegen muesste soetwas eigentlich
kommentiert werden, a la
int whatnot(int unused)
{
(void)unused; /* silence cmpiler */[*]
Schliesslich koennte das mal jemand lesen, der mit den Eigenarten von
gcc oder gar lint ueberhaupt nicht vertraut ist, und sich
einigermassen berechtigt wundern, was der Sinn dieser Zeile gewesen
sein koennte.
> Es mag zwar unueblich zu sein, das so zu sehen,
Es ist durchaus nicht 'unueblich', dass nennenswerte Teile von
existierendem Code 'irgendwelcher funktionslose Mist' sind, dessen
auschliesslicher Zweck mir zu sein scheint, auch noch das einfachste
moeglichst kompliziert erscheinen zu lassen und einen
unvoreingenommenen Leser auf eine moeglichst bizarre Weise zu
verwirren.
[*]
(void)printf("%\n", d); /* Tibetanischer Grunzochse im Anmarsch */