Re: [RFC] CodingGuidelines: mark external declarations with "extern"
- From
Đoàn Trần Công Danh <congdanhqx@gmail.com>
- Date
- Oct 10, 2020, 00:37 UTC
- Message-ID
- <20201010003701.GC27795@danh.dev>
- In-Reply-To
- <xmqqpn5rrvfg.fsf@gitster.c.googlers.com>
On 2020-10-09 13:33:39-0700, Junio C Hamano <gitster@pobox.com> wrote:
Show 18 quoted lines
> Jeff King <peff@peff.net> 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.
Show 29 quoted lines
>
> $ 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