Date: Mon, 31 Jan 2005 17:31:17 +0100 From: Ulrich Spoerlein <q@uni.de> To: Poul-Henning Kamp <phk@phk.freebsd.dk> Cc: arch@freebsd.org Subject: Re: c99/c++ localised variable definition Message-ID: <20050131163117.GE828@galgenberg.net> In-Reply-To: <90392.1107174969@critter.freebsd.dk> References: <20050131122609.GA83556@gurney.reilly.home> <90392.1107174969@critter.freebsd.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 31.01.2005 at 13:36:09 +0100, Poul-Henning Kamp wrote: > >If you carelessly c++-ify a loop like: > > > > for (int i = 0; i < N; i++) > > { > > if (some_condition(i)) break; > > } > > do_something_with(i); /* use finishing index */ > > > >you can miss the fact that the value of i is used outside of the > >loop. The newly created scope for "i" shadows the presumably > >pre-existing definition of i at the top of the function, which > >is what do_something_with() gets to see. > > I would _really_ hope we have the compiler warning about this > already ? Doesn't look so: #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int N = 42; int i; for (int i = 0; i < N; i++) if (i == 23) break; printf("%d\n", i); /* use finishing index */ return (0); } % cc -Wall -std=c99 test.c && ./a.out 1 % icc -Wall -std=c99 test.c && ./a.out test.c(12): remark #592: variable "i" is used before its value is set printf("%d\n", i); /* use finishing index */ ^ 0 But the ICC warning is bogus too, if you happen to set i before, the warning disappears. Ulrich Spoerlein -- PGP Key ID: F0DB9F44 Encrypted mail welcome! Fingerprint: F1CE D062 0CA9 ADE3 349B 2FE8 980A C6B5 F0DB 9F44 Ok, which part of "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn." didn't you understand?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050131163117.GE828>