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

variable externe

21 réponses
Avatar
did
salut
voici mon probleme : je déclare une variable externe dans un fichier
d'en tete, comme ceci
#include <stdio.h>

...

extern int truc ;


ensuite, je désire l'utiliser dans un autre fichier qui inclus le
fichier d'entete ou est déclaré truc.
Je fais donc :
truc = 2 ;
et la le compilateur me dit qu'en gros, il ne sait pas d'ou sort la
variable truc.
J'aimerai savoir comment on fait pour pouvoir se servir d'une variable
externe...
merci :)
did

10 réponses

1 2 3
Avatar
Sébastien
"did" a écrit dans le message de
news:40c9fbaa$0$22014$
salut
voici mon probleme : je déclare une variable externe dans un fichier
d'en tete, comme ceci
#include <stdio.h>

...

extern int truc ;


ensuite, je désire l'utiliser dans un autre fichier qui inclus le
fichier d'entete ou est déclaré truc.
Je fais donc :
truc = 2 ;
et la le compilateur me dit qu'en gros, il ne sait pas d'ou sort la
variable truc.
J'aimerai savoir comment on fait pour pouvoir se servir d'une variable
externe...
merci :)
did


Le compilo ou le linker ?
normalement :

1.c
-----

...

int g_i; // i global
...
-----

globals.h
-----
extern int g_i;
...
------

2.c
-------
#include "globals.h"
...
g_i = 0;
...

Normalement c'est come ca que ca marche

Avatar
Thierry Boudet
On 2004-06-11, Sébastien wrote:

normalement :

1.c
-----

...

int g_i; // i global
...
-----

globals.h
-----
extern int g_i;


/*Hop, suite à une évolution du bouzin, il faut passer en
flottant. Je change donc dans "globals.h" la déclaration.*/

extern float g_i;

...
------

2.c
-------
#include "globals.h"
...
g_i = 0;
...

Normalement c'est come ca que ca marche


Et maintenant, ça va compiler, mais peut-être mal se
passer à l'édition des liens... Me trompais-je ?


--
Bien plus zen que le Contrat Social, et ouvert à tous:
http://tth.vaboofer.com/Cette/cafe_social.html

Avatar
Sébastien
"Thierry Boudet" a écrit dans le message de
news:
On 2004-06-11, Sébastien wrote:

normalement :

1.c
-----

...

int g_i; // i global
...
-----

globals.h
-----
extern int g_i;


/*Hop, suite à une évolution du bouzin, il faut passer en
flottant. Je change donc dans "globals.h" la déclaration.*/

extern float g_i;

...
------

2.c
-------
#include "globals.h"
...
g_i = 0;
...

Normalement c'est come ca que ca marche


Et maintenant, ça va compiler, mais peut-être mal se
passer à l'édition des liens... Me trompais-je ?
Je pense que non. En tout cas si c'est pas à l'édition c'est à l'exec...

Si tu as une autre solution....


--
Bien plus zen que le Contrat Social, et ouvert à tous:
http://tth.vaboofer.com/Cette/cafe_social.html



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', did wrote:

voici mon probleme : je déclare une variable externe dans un fichier
d'en tete, comme ceci

extern int truc ;


En admettant que tu ais vraiment besoin d'un variable globale (une bonne
conception permet généralement d'éviter cette pratique douteuse), c'est comme
ça qu'il faut faire.

http://mapage.noos.fr/emdel/notes.htm#globales

ensuite, je désire l'utiliser dans un autre fichier qui inclus le
fichier d'entete ou est déclaré truc.
Je fais donc :
truc = 2 ;
et la le compilateur me dit qu'en gros, il ne sait pas d'ou sort la
variable truc.
J'aimerai savoir comment on fait pour pouvoir se servir d'une variable
externe...


C'est le linker (et non le compilateur) qui te dis qu'il ne trouve pas de
définition pour cette fonction. (il ne peut résoudre le lien). C'est normal.
Il faut définir cette variable.

Il manque un

#include "le_header_ou_est_declare_truc.h"

int truc;

dans un fichier genre "globals.c"

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Thierry Boudet wrote:

1.c
-----
int g_i; // i global
...
-----

globals.h
-----
extern int g_i;


/*Hop, suite à une évolution du bouzin, il faut passer en
flottant. Je change donc dans "globals.h" la déclaration.*/

extern float g_i;
------

2.c
-------
#include "globals.h"
...
g_i = 0;

Et maintenant, ça va compiler, mais peut-être mal se

passer à l'édition des liens... Me trompais-je ?


Ca va surtout cartonner à l'exécution (le linker ne vérifie pas les types).

C'est pourquoi, afin de garantir la cohérence du code, le header doit être
inclus dans le fichier de définition.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Sébastien" wrote:

normalement :


Mais il manque une sécurité essentielle :

1.c
-----


#include "globals.h"

...

int g_i; // i global
...


http://mapage.noos.fr/emdel/notes.htm#globales

Sinon, en cas d'évolution des types, un oubli est possible, et c'est le UB.

http://mapage.noos.fr/emdel/init_c.htm#UB

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Horst Kraemer
On Fri, 11 Jun 2004 20:36:00 +0200, did wrote:

salut
voici mon probleme : je déclare une variable externe dans un fichier
d'en tete, comme ceci
#include <stdio.h>

...

extern int truc ;

ensuite, je désire l'utiliser dans un autre fichier qui inclus le
fichier d'entete ou est déclaré truc.
Je fais donc :
truc = 2 ;
et la le compilateur me dit qu'en gros, il ne sait pas d'ou sort la
variable truc.
J'aimerai savoir comment on fait pour pouvoir se servir d'une variable
externe...


Comme tu viens de dire

extern int truc ;

n'est qu'une *déclaration* d'une variable 'truc'. Pour l'utiliser il
faut la *définir* dans un et un *seul* fichier quelconque de ton
projet

par

int truc;

ou bien

int truc = 42;

Si ce fichier est lié au projet, alors tu peux utiliser 'truc' dans
tous les fichiers qui ont inclus ton fichier .h qui contient 'extern
int truc;'.

--
Horst

Avatar
did

En admettant que tu ais vraiment besoin d'un variable globale (une bonne
conception permet généralement d'éviter cette pratique douteuse), c'est comme
ça qu'il faut faire.

Oui. J'ai un projet a rendre et le prof voudrait qu'on gere les erreurs

comme si on avait une variable errno. J'ai donc supposé qu'il fallait
que j'ai recours à une variable externe.

http://mapage.noos.fr/emdel/notes.htm#globales

C'est le linker (et non le compilateur) qui te dis qu'il ne trouve pas de
définition pour cette fonction. (il ne peut résoudre le lien). C'est normal.
Il faut définir cette variable.

Il manque un

#include "le_header_ou_est_declare_truc.h"

int truc;

dans un fichier genre "globals.c"



Merci pour le lien! Et merci pour votre aide. J'y retourne :)
did

Avatar
TP

En admettant que tu ais vraiment besoin d'un variable globale (une bonne
conception permet généralement d'éviter cette pratique douteuse), c'est comme
ça qu'il faut faire.

http://mapage.noos.fr/emdel/notes.htm#globales


Juste une petite question concernant ta page Web :
n'aurait-il pas fallu également préciser "ou d'un bloc" dans la phrase
"Une variable globale est une variable définie en dehors d'une fonction
"OU D'UN BLOC" et de portée globale.
Mais il est vrai qu'un bloc se trouve obligatoirement dans... une fonction.
J'ai un peu bon là avec ma remarque ou pas du tout ?
TP

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', TP <noSpam> wrote:

http://mapage.noos.fr/emdel/notes.htm#globales


Juste une petite question concernant ta page Web :
n'aurait-il pas fallu également préciser "ou d'un bloc" dans la phrase
"Une variable globale est une variable définie en dehors d'une fonction
"OU D'UN BLOC" et de portée globale.


Si elle est en dehors d'une fonction, elle est forcément hors d'un bloc. J'ai
du mal à saisir la nuance. As-tu un exemple ?

Mais il est vrai qu'un bloc se trouve obligatoirement dans... une
fonction.


Alors on est d'accord.

J'ai un peu bon là avec ma remarque ou pas du tout ?


Euh, à ton avis ?

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


1 2 3