git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Is 'for (int i = [...]' bad for C STD compliance reasons? (was: [PATCH] MyFirstContribution.txt: fix undeclared variable i in sample code)

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Nov 14, 2021, 14:28 UTC
Message-ID
<211114.868rxqu7hr.gmgdl@evledraar.gmail.com>
In-Reply-To
<xmqq7ddbme7q.fsf@gitster.g>
On Sat, Nov 13 2021, Junio C Hamano wrote:
Show 13 quoted lines
> Saksham Mittal <gotlouemail@gmail.com> writes:
>
>>> It is declared, there is an "int i;" a few lines up.
>>
>> Oh, man, I never even saw that! The patch is completely unnecessary
>> then. Sorry for that!
>
> No need to say sorry; you'd want to be a bit more careful next time,
> that's all.
>
> Also, our code does not introduce a new variable in the first part
> of "for (;;)" loop control, so even if the original lacked decl for
> "i", the posted patch is not how we write our code for this project.

Just curious: Out of preference, or for compatibility with older C standards?

I'd think with the things we depend on in C99 it's probable that we could start using this if standards conformance is the only obstacle.

But I haven't tested, so maybe I'm wrong, I'm just assuming that with the C99 features we do have a hard dependency on surely anyone implementing those would have implemented this too.

There's also a stylistic reason to avoid this pattern, i.e. some would argue that it's better to declare variables up-front, since it tends to encourage one to keep function definitions smaller (various in-tree evidence to the contrary, but whatever).

I'd generally agree with that viewpoint & desire, but there's also cases where being able to declare things in-line helps readability, e.g. when your function needs two for-loops for some reason, they're set a bit apart. Then the reader doesn't need to scan for whether an "i" is used in-between the two.

I was thinking of the below code in bundle.c, I suppose some might find the post-image less readable, but I remember starting to hunt around for other out-of-loop uses of "i", which the post-image makes clear could be avoided as far as variable scoping goes:

diff --git a/bundle.c b/bundle.c
index a0bb687b0f4..94edc186187 100644
--- a/bundle.c
+++ b/bundle.c
@@ -194,14 +194,14 @@ int verify_bundle(struct repository *r,
 	struct rev_info revs;
 	const char *argv[] = {NULL, "--all", NULL};
 	struct commit *commit;
-	int i, ret = 0, req_nr;
+	int ret = 0, req_nr;
 	const char *message = _("Repository lacks these prerequisite commits:");
 
 	if (!r || !r->objects || !r->objects->odb)
 		return error(_("need a repository to verify a bundle"));
 
 	repo_init_revisions(r, &revs, NULL);
-	for (i = 0; i < p->nr; i++) {
+	for (int i = 0; i < p->nr; i++) {
 		struct string_list_item *e = p->items + i;
 		const char *name = e->string;
 		struct object_id *oid = e->util;
@@ -223,12 +223,11 @@ int verify_bundle(struct repository *r,
 	if (prepare_revision_walk(&revs))
 		die(_("revision walk setup failed"));
 
-	i = req_nr;
-	while (i && (commit = get_revision(&revs)))
+	for (int i = req_nr; i && (commit = get_revision(&revs));)
 		if (commit->object.flags & PREREQ_MARK)
 			i--;
 
-	for (i = 0; i < p->nr; i++) {
+	for (int i = 0; i < p->nr; i++) {
 		struct string_list_item *e = p->items + i;
 		const char *name = e->string;
 		const struct object_id *oid = e->util;
@@ -242,7 +241,7 @@ int verify_bundle(struct repository *r,
 	}
 
 	/* Clean up objects used, as they will be reused. */
-	for (i = 0; i < p->nr; i++) {
+	for (int i = 0; i < p->nr; i++) {
 		struct string_list_item *e = p->items + i;
 		struct object_id *oid = e->util;
 		commit = lookup_commit_reference_gently(r, oid, 1);
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 22 in “MyFirstContribution.txt: fix undeclared variable i in sample code”
  1. MyFirstContribution.txt: fix undeclared variable i in sample codeSaksham Mittal, Nov 13, 2021
  2. Johannes AltmanningerNov 13, 2021
  3. Saksham MittalNov 13, 2021
  4. Junio C HamanoNov 14, 2021
  5. Is 'for (int i = [...]' bad for C STD compliance reasons? (was: [PATCH] MyFirstContribution.txt: fix undeclared variable i in sample code)Ævar Arnfjörð Bjarmason, Nov 14, 2021
  6. Junio C HamanoNov 14, 2021
  7. Ævar Arnfjörð BjarmasonNov 14, 2021
  8. Carlo ArenasNov 14, 2021
  9. brian m. carlsonNov 14, 2021
  10. Carlo ArenasNov 14, 2021
  11. revision: use C99 declaration of variable in for() loopJunio C Hamano, Nov 15, 2021
  12. Martin ÅgrenNov 15, 2021
  13. Junio C HamanoNov 16, 2021
  14. brian m. carlsonNov 15, 2021
  15. Phillip WoodNov 17, 2021
  16. Ævar Arnfjörð BjarmasonNov 17, 2021
  17. SZEDER GáborNov 17, 2021
  18. Junio C HamanoNov 18, 2021
  19. Phillip WoodDec 7, 2021
  20. Junio C HamanoDec 7, 2021
  21. Removing -Wdeclaration-after-statement (was: [PATCH] revision: use C99 declaration of variable in for() loop)Ævar Arnfjörð Bjarmason, Dec 8, 2021
  22. Junio C HamanoDec 8, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.