Re: static declaration follows non-static one

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2016-06-28 at 10:52 -0600, Martin Sebor wrote:
> On 06/27/2016 10:06 PM, Andrew Makhorin wrote:
> > Hello,
> >
> > On compiling the following code with gcc (Debian 4.7.2-5) 4.7.2
> >
> > 	#include <stdio.h>
> >
> > 	extern int foo(void);
> >
> > 	static int foo(void) { return 271828; }
> >
> > 	int main(void)
> > 	{
> > 	      printf("foo = %d\n", foo());
> > 	      return 0;
> > 	}
> >
> > the compiler reports the error:
> >
> > 	foo.c:5:12: error: static declaration of ‘foo’ follows non-static
> > declaration
> > 	foo.c:3:12: note: previous declaration of ‘foo’ was here
> >
> > However, the Standard says:
> >
> > 	If the declaration of an identifier for an object or a function
> > 	contains the storage-class specifier extern, the identifier has
> > 	the same linkage as any visible declaration of the identifier
> > 	with file scope.
> >
> > Is it a gcc bug or I misunderstand something?

Thank you for your response.

> 
> Paragraph 7 of the same section (Linkage of Identifiers) should
> help explain the error:
> 
>    If, within a translation unit, the same identifier appears with
>    both internal and external linkage, the behavior is undefined.

In my example 'foo' has internal ("the same") linkage.

Kalle pointed me out TC1 that describes some changes in the Standard.
In fact, if the static declaration precedes extern one, no error is
reported.

> 
> Unlike the text quoted above, this paragraph hasn't changed between
> C89 and the current C11.
> 
> GCC is strict in this case and diagnoses the undefined behavior
> by rejecting the program.  (It seems that C could and probably
> should require an error here.)

It is not obvious to me. The change does not simplify translation, but
the former rule looks more consistent.


Andrew Makhorin




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux