Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Variablendeklaration mitten im Block

1 view
Skip to first unread message

Bastian Erdnuess

unread,
Nov 28, 2009, 4:29:46 AM11/28/09
to
Hallo,

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

Stefan Ernst

unread,
Nov 28, 2009, 5:00:35 AM11/28/09
to
Zitat aus der GCC-Doku (allerdings 4.3.3):

> 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�

Thomas Koller

unread,
Nov 28, 2009, 5:00:46 AM11/28/09
to

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

Bastian Erdnuess

unread,
Nov 28, 2009, 6:42:12 AM11/28/09
to
Thomas Koller <tko...@gmx.at> wrote:

> 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

Stefan Reuther

unread,
Nov 28, 2009, 9:28:29 AM11/28/09
to
Bastian Erdnuess wrote:

> Thomas Koller <tko...@gmx.at> wrote:
>>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. ;-)

Wenn du noch mehr als "alle" Warnungen haben willst, musst du aber noch
'-W' bzw. neuerdings '-Wextra' dazupacken :-)


Stefan

Bastian Erdnuess

unread,
Nov 29, 2009, 2:39:54 AM11/29/09
to
Stefan Reuther <stefa...@arcor.de> wrote:

> 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

Message has been deleted

Claus Reibenstein

unread,
Nov 29, 2009, 10:11:18 AM11/29/09
to
Stefan Ram schrieb:

> 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

Bastian Erdnuess

unread,
Nov 29, 2009, 11:10:25 AM11/29/09
to
Stefan Ram <r...@zedat.fu-berlin.de> wrote:

> 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

Rainer Weikusat

unread,
Nov 29, 2009, 12:25:30 PM11/29/09
to

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')

Bastian Erdnuess

unread,
Nov 29, 2009, 1:05:24 PM11/29/09
to
Rainer Weikusat <rwei...@mssgmbh.com> wrote:

> 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

Georg Bauhaus

unread,
Nov 30, 2009, 6:28:43 AM11/30/09
to
Bastian Erdnuess schrieb:

F�r Konformit�tspr�fung, Standardfragen, und �berhaupt w�rde
ich vorschlagen, auch den compiler von Comeaucomputing f�r den
den Werkzeugkasten zu kaufen.

Juergen Ilse

unread,
Nov 30, 2009, 6:46:02 AM11/30/09
to
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 ...

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 ...

Bastian Erdnuess

unread,
Nov 30, 2009, 8:06:28 AM11/30/09
to
Juergen Ilse <jue...@usenet-verwaltung.de> wrote:

> 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.

Markus Wichmann

unread,
Nov 30, 2009, 9:30:40 AM11/30/09
to
Juergen Ilse (jue...@usenet-verwaltung.de) schrieb:

> 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).

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

Message has been deleted

Juergen Ilse

unread,
Nov 30, 2009, 6:14:20 PM11/30/09
to
Hallo,

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) ...

Bastian Erdnuess

unread,
Dec 1, 2009, 3:15:51 AM12/1/09
to
Juergen Ilse <jue...@usenet-verwaltung.de> wrote:

> 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

Bastian Erdnuess

unread,
Dec 1, 2009, 4:11:56 AM12/1/09
to
Bastian Erdnuess <eart...@web.de> wrote:

Nur leider scheint von Haus aus kein Support f�r meine Plattform (Darwin
9.8.0) vorgesehen zu sein :-(

> Bastian

Rainer Weikusat

unread,
Dec 1, 2009, 5:57:07 AM12/1/09
to
Juergen Ilse <jue...@usenet-verwaltung.de> writes:
> 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.

'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 */

0 new messages