Eus <reply.to.eus.at.member.fsf....@gmail.com> writes:

> I think the difference between "int i;" and "extern int i;" at
> file-scope in C is that "int i;" will only be treated as a definition if
> it is not defined in another place in the same file/TU. IOW, its linkage
> is internal within the TU itself. But, "extern int i" is definitely
> treated as a declaration only that can later be defined either in the
> same TU or in another one.
>
> Is that true?

What you are describing is a common and traditional implementation of C,
but it is not strictly standard conformant.  The ISO C standard says
that "int i;" is always a definition, and "extern int i;" is always a
declaration.  What you decribe is listed as a common extension (at least
in C90--I didn't bother to check C99).


> Finally, is there any difference in declaring a non-inline function
> prototype with and without "extern" in C? That is, is there any
> difference between:
>
> extern int foo (int *bar);
>
> and
>
> int foo (int *bar);
>
> ?
>
> I think they are completely identical. Is that correct?

Yes.  In a function (not variable) declaration, the "extern" is
optional.  This is true in both C and C++.


> Also, is there any difference in defining a non-inline function with and
> without "extern" in C? That is, is there any difference between:
>
> extern int foo (int *bar)
> {
>     return *bar + 5;
> }
>
> and
>
> int foo (int *bar)
> {
>     return *bar + 5;
> }
>
> ?
>
> I think they are also identical. Am I right? Who knows the one with
> "extern" can be overridden in another TU defining its own definition
> without "extern".

These are not identical, but the meaning in C is complex because it
changes depending on which standard you are using.  Look at the docs for
the -fgnu89-inline option and the gnu_inline function attribute.

Ian

Reply via email to