Path: csiph.com!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: on allowing "int a" definition everywhere Date: Thu, 22 Aug 2024 02:21:56 -0700 Organization: None to speak of Lines: 81 Message-ID: <87h6bchpzf.fsf@nosuchdomain.example.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Thu, 22 Aug 2024 11:21:57 +0200 (CEST) Injection-Info: dont-email.me; posting-host="da918a99e4143e2bc1b37425b53bc125"; logging-data="417218"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/YlIBqyGDoVQbRtiJASDNC" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:fu/hzLt1ccHHSszRx9PUKbk/3Xc= sha1:jFl0uqfDPvDTi7d4gyBS9U38q1w= Xref: csiph.com comp.lang.c:387686 Blue-Maned_Hawk 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.com void Void(void) { Void(); } /* The recursive call of the void */