Sujet : Re: on allowing "int a" definition everywhere
De : Keith.S.Thompson+u (at) *nospam* gmail.com (Keith Thompson)
Groupes : comp.lang.cDate : 22. Aug 2024, 10:21:56
Autres entêtes
Organisation : None to speak of
Message-ID : <87h6bchpzf.fsf@nosuchdomain.example.com>
References : 1 2 3 4 5
User-Agent : Gnus/5.13 (Gnus v5.13)
Blue-Maned_Hawk <
bluemanedhawk@invalid.invalid> writes:
Thiago Adams wrote:
[...]
I like the ability to declare things inside if.
if (FILE* f = fopen("file.txt", "r"))
{
/*...*/ fclose(f);
}
Because it makes the scope of f, associated with the pointed object
lifetime.
For instance, if you try to use f
if (FILE* f = fopen("file.txt", "r"))
{
/*...*/ fclose(f);
}
fwrite(f, ..) ;// ERROR
>
You can already do that in C23:
Are you suggesting that there's some relevant new feature in C23?
I don't believe there is.
if (…) {
FILE * f = fopen("file.txt", "r");
/* … */
fclose(f);
}
fwrite(f, …); /* Some kind of error happens. */
I presume the "…" is meant to stand in for some arbitary code, not that
the ellipsis is part of the C23 syntax.
That's not at all the same thing. In Thiago's code, the body
of the if statement is not executed if the fopen() call fails.
Note that fclose(f) has undefined behavior of f==NULL.
Or, if you need it to exist before the controlling expression:
>
for (bool x = true; x; x = false) for (FILE * f = fopen("file.txt", "r");
x; x = false) if (…) {
/* … */
fclose(f);
}
fwrite(f, …);
>
Therefore, your example does not work as evidence in favor of declarations
in if statement controlling expressions because it's already possible in
other ways.
I'm not going to wade through that, but *of course* you can write code
that does what Thiago's code is intended to do. The point of allowing
declarations in if conditions is for convenience, the same reason
they're allowed in for loops starting in C99.
The original code:
if (FILE* f = fopen("file.txt", "r"))
{
/*...*/ fclose(f);
}
doesn't allow for taking some non-trivial action of the fopen() call
fails, but if a declaration in an if condition is visible in the else
clause, you could write something like:
if (FILE* f = fopen("file.txt", "r")) {
/*...*/
fclose(f);
}
else {
perror("file.txt");
exit(EXIT_FAILURE); // or try something else
}
-- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.comvoid Void(void) { Void(); } /* The recursive call of the void */