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.