Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variable extern ? Multiple redéfinition.

3 réponses
Avatar
Stephane Wirtel
Salut tlm,

j'ai un léger problème avec des variables extern.

deux fichiers.
main.c :

#include <stdio.h>
extern static int i;
int main(int argc, char **argv)
{
printf("%d\n", i);
}

function.c :
extern static int i = 10;

compilation -> erreur
main.c:26: error: multiple storage classes in declaration of `i'



ce qui est étrange, c'est que si j'enlève le mot réservé "static" dans
les deux fichiers, la compilation se déroule correctement.

--> main.c :
#include <stdio.h>
extern int i;
int main(int argc, char **argv)
{
printf("%d\n", i);
}

function.c:
extern int i = 10;



Compilateur employé : gcc-3.3.1

Quelqu'un aurait-il une idée?

A+

Stéphane


--
Stephane Wirtel <stephane.wirtel@belgacom.net>
GPG ID : 0xC9C16DA7

3 réponses

Avatar
Erwann ABALEA
Bonsoir,

On Wed, 15 Oct 2003, Stephane Wirtel wrote:

deux fichiers.
main.c :

#include <stdio.h>
extern static int i;
int main(int argc, char **argv)
{
printf("%dn", i);
}

function.c :
extern static int i = 10;

compilation -> erreur
main.c:26: error: multiple storage classes in declaration of `i'


Ben? Sans lire la norme, je dirais que c'est un comportement tout à fait
normal.

Tu essayes de déclarer une variable qui est à la fois:
- externe à l'unité compilée (ici main.c), et donc déclarée dans
au moins une autre unité,
- visible uniquement dans cette unité (static).

Ca ne peut pas marcher.

Si, d'après les Saintes Ecritures, il s'avérait que je me suis lourdement
trompé, n'hésitez pas à me traiter de vil vermiceau. ;)

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
j'ai oublié de dire que je n ai pas de confirmation sur la source de
cette information.
Cela peut se réveler être une fausse rumeur !
-+- JPB in: GNU - Une fausse rumeur est-elle une vraie info ? -+-

Avatar
DINH Viêt Hoà

#include <stdio.h>
extern static int i;
int main(int argc, char **argv)
{
printf("%dn", i);
}

function.c :
extern static int i = 10;


et tu essaies de faire quoi avec des extern static ?

static pour une variable limite la visiblité au module (.o ou .obj ou
autre suivant le système) que tu compiles.

et extern définit l'existance d'une variable qui a déjà une valeur ou à
laquelle sera attribuée une valeur.

donc, "extern int i = 10;" me choque un peu
tout autant que "extern static".

Donc, il faut m'expliquer ce que tu veux faire, à part essayer toutes les
combinaisons de mots-clefs possible.

--
DINH V. Hoa,

"Ma tuxitude me beastifie" -- sunZ

Avatar
Horst Kraemer
On Wed, 15 Oct 2003 00:26:35 +0200, Stephane Wirtel
wrote:

Salut tlm,

j'ai un léger problème avec des variables extern.

deux fichiers.
main.c :

#include <stdio.h>
extern static int i;
int main(int argc, char **argv)
{
printf("%dn", i);
}

function.c :
extern static int i = 10;

compilation -> erreur
main.c:26: error: multiple storage classes in declaration of `i'



ce qui est étrange, c'est que si j'enlève le mot réservé "static" dans
les deux fichiers, la compilation se déroule correctement.

--> main.c :
#include <stdio.h>
extern int i;
int main(int argc, char **argv)
{
printf("%dn", i);
}

function.c:
extern int i = 10;



Compilateur employé : gcc-3.3.1

Quelqu'un aurait-il une idée?


Le compilateur vient de t'expliquer le problème. "static" et "extern"
se contredisent.

static int i;

déclare et crée (définit) une variable qui n'est visible (accessible)
que dans le fichier où elle est déclarée. Quand tu as static int i
dans plusieurs fichiers il s'agit donc de variables différentes.

extern int i;

déclare l'existence un variable qui est visible dans tous les fichiers
du projet. Cela ne crée pas la variable,. Cette déclaration ne permet
que l'usage de cette variable dans le code de ce fichier.

int i;
ou
extern int i;
int i;
ou
extern int i;
int iB;
ou
extern int iB;

déclare l'existence d'une variable i qui est visible dans tous les
fichiers du projet et crée la variable *ici*.

Pour toute variable visible dans le projet entier il faut qu'elle soit
crée dans un *seul* fichier du projet. Donc

int i;

dans deux fichiers du projet est une erreur. et seulement

extern int i;

dans tous les fichiers du projet est aussi une erreur si i est utiliée
dans un ou plusieurs fichiers parce que'elle n'a été crée nulle part.

Une méthode préférée pour l'usage de ces variables dites "globales"
est de mettre des déclarations (sans initialisation!)

extern int i;
extern int j;
....
dans un fichier comme global.h et de mettre #include "global.h" dans
tous les fichiers qui utiliseront les variables. En plus il faut que
chacune de ces variables sera définie par

int i;
ou
int iB;

une fois dans un fichier quelconque du projet.

Pour centraliser cette "création" dans un grand projet on pourrait
créer un fichier global.c avec le contenu

#include "global.h"
int i;
int jB;

et lier global.c au projet.
...
--
Horst