Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define extern variable along with declaration?

Wiki says:

The extern keyword means "declare without defining". In other words, it is a way to explicitly declare a variable, or to force a declaration without a definition. It is also possible to explicitly define a variable, i.e. to force a definition. It is done by assigning an initialization value to a variable.

That means, an extern declaration that initializes the variable serves as a definition for that variable. So,

/* Just for testing purpose only */ 
#include <stdio.h>
extern int y = 0;
int main(){
    printf("%d\n", y);
    return 0;
}

should be valid (compiled in C++11). But when compiled with options -Wall -Wextra -pedantic -std=c99 in GCC 4.7.2, produces a warning:

[Warning] 'y' initialized and declared 'extern' [enabled by default]

which should not. AFAIK,

extern int y = 0;  

is effectively the same as

int i = 0;  

What's going wrong here ?

like image 356
haccks Avatar asked Jun 26 '14 17:06

haccks


2 Answers

All three versions of the standard — ISO/IEC 9899:1990, ISO/IEC 9899:1999 and ISO/IEC 9899:2011 — contain an example in the section with the title External object definitions (§6.7.2 of C90, and §6.9.2 of C99 and C11) which shows:

EXAMPLE 1

int i1 = 1;        // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4;            // tentative definition, external linkage
static int i5;     // tentative definition, internal linkage

The example continues, but the extern int i3 = 3; line clearly shows that the standard indicates that it should be allowed. Note, however, that examples in the standard are technically not 'normative' (see the foreword in the standard); they are not a definitive statement of what is and is not allowed.

That said, most people most of the time do not use extern and an initializer.

like image 152
Jonathan Leffler Avatar answered Oct 10 '22 21:10

Jonathan Leffler


This code is perfectly valid.

But any compiler is free to issue additional (informative or not) diagnostics:

(C99, 5.1.1.3p1 fn 8) "Of course, an implementation is free to produce any number of diagnostics as long as a valid program is still correctly translated."

What a compiler cannot do is not emitting a diagnostic when there is a constraint or syntax violation.

EDIT:

As devnull put in the OP question comments, Joseph Myers from gcc team explains in a bug report questioning this diagnostic:

"This is a coding style warning - the code is valid, but extremely unidiomatic for C since "extern" is generally expected to mean that the declaration is not providing a definition of the object."

like image 20
ouah Avatar answered Oct 10 '22 20:10

ouah