On 2020-10-09 13:33:39-0700, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Jeff King <peff@xxxxxxxx> writes: > > > The argument for including it is less clear to me. You say below: > > > >> [...]By doing so, we would also prevent a > >> mistake of not writing "extern" when we need to (i.e. decls of data > >> items, that are not functions) when less experienced developers try > >> to mimic how the existing surrounding declarations are written. > > > > but to my recollection that has not been a big problem. And it's one > > that's usually easily caught by the compiler. A missing "extern" on a > > variable will usually get you a multiple-definition warning at > > link-time (if you manage to also omit the actual definition you won't > > see that, though "make sparse" will warn that your variable ought to be > > static). > > Not really, that is where the "common" extension comes in, to help > us with it hurt others without it, unknowingly X-<. Yes, that's where tentative definition jumpes in. But, tentative definition is known to cause headache to compiler optimization. And from GCC 10, gcc change to `-fno-common` by default. We can enable `-fno-common` now if we can detect our compiler is gcc, but, I don't think it worth to fiddle with Makefile to add that logic. > > $ cat >a.c <<\EOF > #include <stdio.h> > #include "c.h" > > int common = 47; > > int main(int ac, char **av) > { > printf("%d\n", common + other); > return 0; > } > EOF > $ cat >b.c <<\EOF > #include "c.h" > > int other = 22; > EOF > $ cat >c.h <<\EOF > int common; > int other; > EOF > $ gcc -Wall -o c a.c b.c; ./c > 59 > > And I have a strong preference, after thinking about it, to have > "extern" in front in the declarations. It gives another clue for > patterns I feed to "git grep" to latch onto, and help my eyes to > scan and tell decls and defns apart in the output. With this argument, I think adding "extern" is worth it. It could help people find the code better. -- Danh